2011-06-14 71 views
9

我最近偶然发现了一个奇怪的情况下(ATLEAST对我来说,因为我没有这个遇到过)..考虑下面的简单代码: -scanf()好奇的行为!

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

上面的代码需要一个正常的整数输入并显示结果如预期..

现在,如果我修改了上面的代码如下: -

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

这需要在另一个额外的输入它给人的printf语句的结果之前..我不理解为什么一个空间结果LTS在scanf()的..谁能解释这对我的行为的变化....

+1

scanf是EVIL,应该避免 - 所以说我和其他人:):http:// stackoverflow。com/questions/456303/how-to-validate-input-using-scanf – Bukes 2011-06-14 21:13:05

+0

@Bukes:是的,如果你不知道如何编程或阅读文档,你不应该使用C – 2011-06-14 21:20:21

+1

@Chris Dodd - 'scanf'无法区分换行符和其他空格。如果你想要很好地控制你的输入,或者从错误中清除错误,你不能使用'scanf',不管你怎么知道C。 – 2011-06-14 21:23:50

回答

8

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

的scanf()系列的功能从控制台或从文件流中读取数据,解析它,然后把结果保存离开你在参数列表中提供的变量。

格式化字符串与printf()中的格式化字符串非常相似,因为您可以告诉它读取“%d”,例如int。 但它也有额外的功能,最值得注意的是它可以吃掉在格式字符串中指定的输入中的其他字符。

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

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

3

man page:

格式字符串包含其中描述的指令序列的 如何处理输入字符的顺序。如果 指令的处理失败,则不会读取其他输入,并返回scanf()。 A “失败”可以是以下任一情况:输入失败,意味着输入字符不可用或匹配失败,这意味着输入不合适(请参阅下文)。

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. 
+0

注意,这意味着当格式中有一个空格时,scanf将会读取输入。消耗并丢弃空白字符,直到找到非空白字符。它会将该字符作为下一个被读取并返回。 – 2011-06-14 21:28:21

0

man scanf

[...] 的空白字符的序列(空格,制表,换行,等; 看到isspace为(3))。该指令与输入中的任意数量的白色 空间(包括无)匹配。

+2

答案是? – 2011-06-14 21:09:11

+1

@Christian Rau:这是关于模式匹配。一个空格'匹配任意数量的空格,[...],在输入'中。看起来像一个答案。 – 2011-06-15 08:11:12