如何阻止此代码挂在错误的输入?

时间:2012-04-09 10:16:02

标签: c

我正在从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;

    }

但它依赖于错误的输入。可以做些什么来检查这种行为?

3 个答案:

答案 0 :(得分:6)

简短版本是“请勿使用scanf()。”

问题是scanf()仅提供有限的错误指示,并且在下一次调用时将未读取的错误数据留下来;特别是如果你不打算做错误检查,它就会永远在坏数据上旋转。

  1. 始终检查返回代码,以便了解它是否有效。
  2. 如果您正在进行面向行的输入,请使用fgets()或类似内容读取整行,并sscanf()从该行进行解析。
  3. 如果输入不是您所期望的,那么做一些明智的事情,而不仅仅是通过。 (您现有的代码只是假设它始终有效。)

答案 1 :(得分:2)

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

答案 2 :(得分:2)

  1. 检查scanf()是否返回2,表示它已填充两个参数
  2. 在switch语句中提供报告错误的默认大小写。
  3. 为了提高健壮性,您可能希望使用fgets()读取整行(不要使用gets(),因为它容易受到缓冲区溢出)并使用sscanf()解析结果。仅当您想要从错误输入提供恢复时,才需要这样做。否则,如果出现任何问题,只需坚持使用scanf()exit(1)(以及错误消息)。