scanf中的空格导致异常结果

时间:2013-12-05 17:25:35

标签: c turbo-c++

通过我搜索解决方案,我找到了question。 这让我思考并做了一些实验:

案例1

#include<stdio.h>
main()
{ char a;
   //some code
  scanf("%c",&a);
   /*This code might not be evaluated(missed) 
    sometimes*/
  //This is how it is solved
  scanf("  %c",&a);
  //the rest of code
  }

案例2

#include<stdio.h>
main()
{ int a;
   //some code
  scanf(" %d ",&a);
  //this one will take 2 numbers instead of one
  //the rest of code
  } 

我对c语言知之甚少,所以如果有人向我解释这些结果,我将不胜感激。(如果重要的话,我正在使用turbo c ++。)

1 个答案:

答案 0 :(得分:1)

一些一般性说明:

  1. 如果您想询问有关C的问题,那么阅读这些功能的工作方式对您有好处。例如,scanf()可以在线获得大量文档。
  2. 当你能提供完整的可编译示例而不是//某些代码
  3. 时,总会更好

    所以在你的第一个例子中,例子是:

    char a, b;
    scanf("%c", &a);
    scanf("%c", &b); // this one will be "missed"
    

    原因是当你在stdin中输入一个角色时,你真正得到两个角色,输入的内容加上一个不可见的换行符('\n')。所以真的第二个scanf没有“错过”它只是拿起一个没有ASCII表示的字符。

    如果你打印这些:

    printf("%c %d\n%c%d\n", a, a, b, b);
    
    你会看到:

    >> ./my_prog
    >> a
    >> a 97
    
       10
    

    因为您输入了“a \ n”并且两个scanf首先读取“a”然后分别读取“\ n”。

    使用带有空格的scanf:

    scanf(" %c", &b); // this one will work instead
    

    告诉scanf应忽略'\n'上留下的任何空白字符(包括换行符stdin)。


    在你的第二种情况下,它不是在寻找2个数字,它正在寻找一个数字和一个空格字符。 scanf(" %d ", &a)说“忽略任何空格,然后查找十进制数,然后查找空格”。但是,一旦变量(a)被填充,它就会停止读取,因为这就是scanf的工作原理:

      

    由一个或多个空格字符组成的指令应通过读取输入执行,直到无法读取更多有效输入,或者直到第一个不是空白字符的字节为止,该字符仍未读取

    所以它并不是真的在寻找另一个数字,你可以在这一点上键入任何东西,它会很高兴,因为它只是在寻找另一个空格字符来输入。所以这个:

    scanf(" %d ", &a);
    
    这个输入可以满足

    >> 5
       f
    

    首先,“%d”与5匹配,然后f后面的换行符与“”

    匹配