我最近偶然发现了一个奇怪的案例(至少对我而言,因为我之前没有遇到过这种情况).考虑下面的简单代码: -
int x;
scanf("%d",&x);
printf("%d",x);
Run Code Online (Sandbox Code Playgroud)
上面的代码采用正常的整数输入并按预期显示结果.
现在,如果我将上面的代码修改为以下代码: -
int x;
scanf("%d ",&x);//notice the extra space after %d
printf("%d",x);
Run Code Online (Sandbox Code Playgroud)
这会在它给出printf语句的结果之前接受另一个额外的输入.我不明白为什么空格会导致scanf()的行为发生变化..任何人都可以向我解释这个....
来自http://beej.us/guide/bgc/output/html/multipage/scanf.html:
scanf()系列函数从控制台或FILE流中读取数据,对其进行解析,并将结果存储在您在参数列表中提供的变量中.
格式字符串与printf()中的格式字符串非常相似,因为您可以告诉它读取"%d",例如对于int.但它还有其他功能,最值得注意的是它可以占用您在格式字符串中指定的输入中的其他字符.
发生的事情是scanf是匹配格式字符串的模式(有点像正则表达式).scanf保持从标准输入(例如控制台)消耗文本,直到匹配整个模式.
在第二个示例中,scanf读入一个数字并将其存储在x中.但它还没有到达格式字符串的末尾 - 还剩下一个空格字符.因此,scanf从标准输入中读取额外的空白字符,以便(尝试)匹配它.