scanf()好奇的行为!

时间:2011-06-14 20:41:00

标签: c++ c scanf

我最近偶然发现了一个奇怪的案例(至少对我来说,因为我之前没有遇到过这种情况)..考虑下面的简单代码: -

int x;
scanf("%d",&x);
printf("%d",x);

上面的代码采用普通的整数输入并按预期显示结果。

现在,如果我将上述代码修改为以下内容: -

int x;
scanf("%d ",&x);//notice the extra space after %d
printf("%d",x);

在它给出printf语句的结果之前,它会接受另一个额外的输入。我不明白为什么空格会导致scanf()的行为发生变化..任何人都可以向我解释这个....

3 个答案:

答案 0 :(得分:8)

来自http://beej.us/guide/bgc/output/html/multipage/scanf.html

  

scanf()系列函数从控制台或FILE流中读取数据,对其进行解析,并将结果存储在您在参数列表中提供的变量中。

     

格式字符串与printf()中的格式字符串非常相似,因为您可以告诉它读取“%d”,例如对于int。 但它还有其他功能,最明显的是它可以占用您在格式字符串中指定的输入中的其他字符。

正在发生的事情是scanf是匹配格式字符串的模式(有点像正则表达式)。 scanf保持从标准输入(例如控制台)消耗文本,直到匹配整个模式。

在第二个示例中,scanf读入一个数字并将其存储在x中。但它还没有到达格式字符串的末尾 - 还剩下一个空格字符。因此,scanf从标准输入中读取额外的空白字符,以便(尝试)匹配它。

答案 1 :(得分:3)

来自man page:

  

格式字符串由一系列描述的指令组成          如何处理输入字符序列。如果处理一个          指令失败,不读取其他输入,并返回scanf()。一个          “失败”可以是以下任何一种:输入失败,意味着          输入字符不可用或匹配失败,这意味着          输入不合适(见下文)。

   A directive is one of the following:

   ?      A  sequence of white-space characters (space, tab, newline, etc;
      see isspace(3)).  This directive matches  any  amount  of  white
      space, including none, in the input.

答案 2 :(得分:0)

man scanf

  

[...]      一系列白色空格字符(空格,制表符,换行符等;      见isspace(3))。该指令匹配任何数量的白色      输入中的空格,包括无。