我在名为 onlineGDB 的在线编译器上编写了以下程序作为单个块。在这个网站上它工作得很好,但是在我将模块拆分为单独的源文件并使用 MinGW 编译后,它卡在第一个循环(validateInput)中。
bool validateInput(float input) {
if (input < 0)
return true;
return false;
}
int main() {
float salaries[SIZE] = { 0 };
float newSalaries[SIZE] = { 0 };
int i = 0;
float *salriesPtr = salaries;
float *newSalariesPtr = newSalaries;
bool exit = false;
bool inputDone = false;
welcome();
do {
do {
salaries[i] = getInput();
inputDone = validateInput (salaries[i]);
newSalaries[i] = payRise (salaries[i]);
i++;
} while (inputDone == false);
output(salriesPtr, newSalariesPtr);
exit = exitProgram ();
} while (exit == false);
return 0;
}
该程序应该不断向数组添加值,直到输入负数。这适用于在线编译器,但在使用 MinGW 编译时会创建无限循环。
编辑:这是MVCE
#define SIZE 100
bool validateInput (float input)
{
if (input < 0)
return true;
return false;
}
int getInput ()
{
int input;
printf ("Enter salary: ");
scanf ("%d%*c", &input);
return (input);
}
int main () {
float salaries[SIZE] = { 0 };
bool inputDone = false;
do
{
salaries[1] = getInput ();
inputDone = validateInput (salaries[1]);
}
while (inputDone == false);
return 0;
}
和头文件。所有其他源文件只是复制到自己的 .c 文件中的函数。
#ifndef MAIN
#define MAIN
void welcome();
float getInput();
float payRise(float salary);
void output(float* salaries, float* newSalaries);
bool validateInput(float input);
bool exitProgram();
#endif
您的问题可能是因为您将getInput声明为返回一个浮点数,但它的定义返回一个int
当您执行salaries[i] = getInput();
代码从int 生成一个浮点数但因为它已经是一个浮点数时,转换是错误的,并且在符号测试之后也是错误的
除此之外,我强烈建议您测试scanf的结果以确保已完成有效输入,否则您肯定不会获得值,因为永远不会绕过无效值
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句