该程序可用于onlineGDB编译器,但使用MinGW编译时会出现逻辑错误

时间:2019-04-23 14:57:07

标签: c

我已经在一个名为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

2 个答案:

答案 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 的结果,以确保完成了有效的输入,否则您肯定不会获得值,因为永远不会绕过无效值