我已经在一个名为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
答案 0 :(得分:0)
您应该测试scanf
的返回值。
实际上,如果您不输入任何内容,则input
的值将保持未初始化状态,这可以解释无限循环。
int getInput ()
{
int input;
printf ("Enter salary: ");
if (2 == scanf ("%d%*c", &input))
return input;
else
/* if scanf was not able to read one integer and one char, return a negative value */
return -1;
}
答案 1 :(得分:0)
您的问题可能是因为您声明 getInput 返回了 float ,但其定义返回了 int
当您执行salaries[i] = getInput();
时,代码会从 int 中生成 float ,但由于它已经是 float ,因此转换为错误,并且在测试符号后也是错误的
除此之外,我强烈建议您测试 scanf 的结果,以确保完成了有效的输入,否则您肯定不会获得值,因为永远不会绕过无效值