scanf的差异(“%”,名称); 和scanf(“%”,名称);

这不是一个错字。 对于没有注意到的人,第二个上有一个空间,第一个上没有空格。

当我做这样的作业时,它发生在我身上:

#include 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); } 

当我执行该代码时,“NAME”部分跳过输入“DATE OF BIRTH”部分

但是,当我更改scanf(“%[^ \ n]”,&name); 到scanf(“%[^ \ n]”,&name); 一切正常。

怎么会发生这种情况? 我似乎不明白这些差异

注意:您可以尝试一下,并告诉我它是否可以正常使用,可能只是因为我的计算机问题或其他原因

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

例:

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

 123
乔博格斯
 22/9/15

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

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

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

  1. %c
  2. %[] – 扫描设置
  3. %n

所有其他(标准)格式说明符跳过前导空格。

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