scanf的差异("%[^ \ n]",名称);和scanf("%[^ \ n]",name);

时间:2015-09-22 06:01:37

标签: c scanf difference

这不是拼写错误。对于那些没有注意到的人,第二个上有一个空格,第一个上没有空格。

当我做这样的家庭作业时,我发生了这样的事情:

#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); 一切正常。

这怎么可能发生?我似乎并不了解差异

注意:你可以尝试一下,并告诉我你的工作正常,可能是因为它只是我的电脑问题或其他什么

2 个答案:

答案 0 :(得分:3)

当您在scanf格式字符串中放置空格时,scanf会将其与任何长度的任何空格匹配。因此,通过将该前导空格放在格式中,scanf实际上将跳过输入中的前导空格(包括前一输入中的换行符)。

示例:

让我们说你的简单程序的输入是

123
Joe Bloggs
22/9/15

第一次调用scanf读取数字123,但保留您输入的换行符以结束输入缓冲区中的输入行。当您下次调用scanf获取名称时,scanf将首先看到换行符立即返回(不消耗它,因此它仍将在输入缓冲区中)。然后,您调用scanf来阅读日期,"%d"格式会自动跳过前导空格,因此scanf将使用换行符,但之后会看到名称,但不会与十进制整数并退出,而不是读取数据。

通过在读取名称时将前导空格添加到格式,第二个scanf调用将读取(并忽略)上一个输入中的换行符,然后正确读取名称,留下终止换行符输入缓冲区中的第二行,然后在下一次正确读取日期的scanf调用时跳过。

答案 1 :(得分:2)

scanf()系列函数有三种标准格式说明符,不会自动跳过空格。他们是:

  1. %c
  2. %[] - 扫描集
  3. %n
  4. 所有其他(标准)格式说明符都会跳过前导空格。

    通过在%[]之前包含空格,您可以跳过前导空格,因为scanf()系列格式字符串(扫描集外)中的单个空格与零个或多个空白字符匹配输入。特别要注意的是,这意味着如果键入一些空白行(只是点击返回),空格将继续快速忽略(更准确地说,丢弃)输入,直到输入非空白字符。只有这样scanf()才会开始处理扫描集。