0

我正在从 Stephen Kochan 的“C 语言编程”中学习 C。我正在做第 6 章的第 4 练习,编写一个充当简单累加器计算器的代码。代码如下。只要以正确的方式顺序提供输入,它就可以正常工作。

#include<stdio.h>

    int main(void)
    {
        float num, accum = 0;

        char operator;


        while(1)

        {

          printf("Enter the number and the operator ");
          scanf("%f %c",&num, &operator);

          if (operator == 'E') break;

          switch (operator){

        case 'S':
          accum = num;
          printf("= %g\n",accum);
          break;

        case '+':
          accum = accum + num;
          printf("= %g\n",accum);
          break;

        case '-':
          accum = accum - num;
          printf("= %g\n",accum);
          break;

        case '*': 
          accum = accum * num;
          printf("= %g\n",accum);
          break;

        case '/':
          accum = accum / num;
          printf("= %g\n",accum);
          break;
          }      
        }

        printf("= %g\n",accum);
        printf("End of Calculation\n");

      return 0;

    }

但它挂在错误的输入上。可以做些什么来检查这种行为?

4

3 回答 3

6

简短的版本是“不要使用scanf()”。

问题是scanf()它只提供了有限的错误指示,并留下未读的错误数据被下一次调用拾取;特别是如果您不费心进行错误检查,那么它只会在错误数据上永远旋转。

  1. 总是检查返回码,这样你就知道它是否有效。
  2. 如果您正在执行面向行的输入,请使用fgets()或类似方法来读取整行,并sscanf()从该行进行解析。
  3. 如果输入不是您所期望的,请做一些明智的事情,而不是仅仅通过。(您现有的代码只是假设它始终有效。)
于 2012-04-09T10:24:58.930 回答
2

不要使用scanf. 这是该计划的第一眼建议。使用类似此处getchar所示的内容他们正在处理与您相同的问题。

于 2012-04-09T10:19:44.847 回答
2
  1. 检查是否scanf()返回 2,表明它已填充了两个参数
  2. 在报告错误的 switch 语句中提供默认情况。

为了提高鲁棒性,您可能希望使用读取整行fgets()(不要使用gets(),因为它容易受到缓冲区溢出的影响)并使用sscanf(). 仅当您想从错误输入中恢复时才需要这样做。否则,如果出现任何问题,请坚持使用scanf()and exit(1)(以及错误消息)。

于 2012-04-09T10:22:58.800 回答