这不是一个错字。对于那些没有注意到的人来说,第二个上有一个空格,第一个上没有空格。
当我做作业时,我会遇到这样的情况:
#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);
}
当我执行该代码时,“姓名”部分会跳到输入“出生日期”部分
但是,当我更改 scanf("%[^\n]",&name); 时进入 scanf(" %[^\n]",&name);
一切正常。
怎么会发生这种事?我似乎不明白这些差异
注意:你可以尝试一下,然后告诉我它在你的电脑上运行是否正常,因为可能只是我的电脑问题或其他问题
当你在 a 中添加一个空格时scanf http://en.cppreference.com/w/c/io/fscanf格式化字符串,然后scanf http://en.cppreference.com/w/c/io/fscanf会将其与任何长度的任何空格相匹配。因此,通过在格式中添加前导空格,scanf http://en.cppreference.com/w/c/io/fscanf实际上会跳过输入中的前导空格(包括前一个输入中的换行符)。
Example:
假设您的简单程序的输入是
123
Joe Bloggs
22/9/15
第一次致电scanf
读取号码123
,但保留您输入的换行符以结束输入缓冲区中的该输入行。当你下次打电话时scanf
得到名字,然后scanf
首先会看到换行符立即返回(没有消耗它,所以它仍然在输入缓冲区中)。然后你打电话scanf
读取日期和"%d"
格式自动跳过前导空格,所以scanf
将消耗换行符,但随后看到名称,它将与十进制整数的格式不匹配并退出,而不是读取数据。
通过在读取名称时将前导空格添加到格式中,第二个scanf
调用将从前一个输入中读取(并忽略)换行符,然后正确读取名称,将第二行中的终止换行符保留在输入缓冲区中,然后下一次调用会跳过该换行符scanf
它可以正确读取日期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)