这不是拼写错误。对于那些没有注意到的人,第二个上有一个空格,第一个上没有空格。
当我做这样的家庭作业时,我发生了这样的事情:
#include<stdio.h>
int main(){
int id,d,m,y;
char name[30];
printf("\tSTUDENT ID\t\t: ");scanf("%d",&id);\
printf("\tNAME\t\t: ");scanf("%[^\n]",&name);
printf("\tDATE OF BIRTH\t: ");scanf("%d/%d/%d",&d,&m,&y);
}
当我执行该代码时,&#34; NAME&#34;部分跳过输入&#34;出生日期&#34;部分
但是,当我更改scanf时(&#34;%[^ \ n]&#34;,&amp; name);到scanf(&#34;%[^ \ n]&#34;,&amp; name); 一切正常。
这怎么可能发生?我似乎并不了解差异
注意:你可以尝试一下,并告诉我你的工作正常,可能是因为它只是我的电脑问题或其他什么
答案 0 :(得分:3)
当您在scanf
格式字符串中放置空格时,scanf
会将其与任何长度的任何空格匹配。因此,通过将该前导空格放在格式中,scanf
实际上将跳过输入中的前导空格(包括前一输入中的换行符)。
示例:
让我们说你的简单程序的输入是
123 Joe Bloggs 22/9/15
第一次调用scanf
读取数字123
,但保留您输入的换行符以结束输入缓冲区中的输入行。当您下次调用scanf
获取名称时,scanf
将首先看到换行符立即返回(不消耗它,因此它仍将在输入缓冲区中)。然后,您调用scanf
来阅读日期,"%d"
格式会自动跳过前导空格,因此scanf
将使用换行符,但之后会看到名称,但不会与十进制整数并退出,而不是读取数据。
通过在读取名称时将前导空格添加到格式,第二个scanf
调用将读取(并忽略)上一个输入中的换行符,然后正确读取名称,留下终止换行符输入缓冲区中的第二行,然后在下一次正确读取日期的scanf
调用时跳过。
答案 1 :(得分:2)
scanf()
系列函数有三种标准格式说明符,不会自动跳过空格。他们是:
%c
%[]
- 扫描集%n
所有其他(标准)格式说明符都会跳过前导空格。
通过在%[]
之前包含空格,您可以跳过前导空格,因为scanf()
系列格式字符串(扫描集外)中的单个空格与零个或多个空白字符匹配输入。特别要注意的是,这意味着如果键入一些空白行(只是点击返回),空格将继续快速忽略(更准确地说,丢弃)输入,直到输入非空白字符。只有这样scanf()
才会开始处理扫描集。