关于检查scanf的返回值

  很多人在使用scanf的时候都不会去检查它的返回值, 包括我在这之前也没有去注意它, 如果你方便去翻翻c语言的教科书, 估计也很难找到有检查scanf的例子或代码段,  至少我还没有见过,  当然, 书上的代码毕竟只是一个练习, 和真正用于产品级别的代码有很大的差别。

  一个偶然的机会, 让我注意到检查scanf返回值的重要性, 写下来和大家分享一下:)

  下面是一个最简单不过的scanf用法,但却有隐患:

  int n;
  scanf( "%d", &n);
  ...

  scanf要求取一个整数,但如果输入的是一个字母,或其它不是数字的字符时,情况会怎么呢? 结果是scanf不读取数据,不修改n的值直接返回了,这样,n就变成了一个未被初始化的变量,其值不可确定,因为其值不确定,所以就算你对n作是否合法的判断,也还是可能会有问题,

  你也许会说,用户应该会输入一个合法的值的,但是,有时scanf并不总是从键盘中读入数据,它可能从其它的设备中去读,例如管道,UNIX中允许这样的玩法,

  你也许还会说,情况没有哪么糟了,可以先初始化n为零,再去判断n是否合法,例如下面这样:

  int n = 0;
  scanf( "%d", &n);
  if (n != 0) {
      //OK,读到用户的值了
  }

  这样好像还是有麻烦啊,这个初始值你怎么定义才好? 0吗? 程序是需要0的时候怎么办?

  让我们再看下面的代码,要求用户输入一个大于0的数为止:

  int n;
  for(;;) {
      printf( "pls input:");
      scanf( "%d", &n);
      if (n > 0) {
          break;
      }
  }

  上面的代码中,当用户输入的不是一个整数时,会死循环,而不是用户想要的:当用户输入非法值时一直让让用户输入一个合法值
为止。为什么会这样呢,因为当scanf检查到所输入的是不合法的值时,它并不会读取它,因此数据会留在缓冲区中,当下一次调用scanf时,会去读缓冲区中的数据,因此仍然会读到一个非法的值。

  解决以上问题最简单的办法,就是在使用scanf的时候,检查它的返回值来判断scanf是否正确地读到了数据。

------------------------------------------------------------------------------------------------------------------------------------------
  转载请注明出处: http://www.tzsblog.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章