我有以下程序:
int main(int argc, char *argv[])
{
int a, b;
char c1, c2;
printf("Enter something: ");
scanf("%d", &a); // line 1
printf("Enter other something: ");
scanf("%d", &b); // line 2
printf("Enter a char: ");
scanf("%c", &c1); // line 3
printf("Enter another char: ");
scanf("%c", &c2); // line 4
printf("Done"); // line 5
system("PAUSE");
return 0;
}
我在 C 书上读到,作者说scanf()
在缓冲区中留下了换行符,因此,程序不会在第 4 行停止让用户输入数据,而是将换行符存储在c2
并移至第 5 行。
是对的吗?
然而,这是否只发生在char
数据类型?因为我没有看到这个问题int
数据类型如第 1、2、3 行。对吗?
The scanf() http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html在尝试解析字符以外的转换之前,函数会自动跳过前导空格。字符格式(主要是%c
;还扫描集%[…]
— and %n
) 属于例外情况;他们不会跳过空格。
Use " %c"
带有前导空白以跳过可选的空白。不要在语句中使用尾随空格scanf()
格式字符串。
请注意,这仍然不会消耗输入流中留下的任何尾随空格,甚至不会消耗到行尾,因此如果还使用,请注意getchar() http://en.cppreference.com/w/c/io/getchar or fgets() http://en.cppreference.com/w/c/io/fgets在同一个输入流上。我们只是让 scanf 跳过空白before转换,就像它一样%d
以及其他非字符转换。
请注意,非空白“指令”(使用POSIX scanf 术语 http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html) 除了转换之外,例如中的文字文本scanf("order = %d", &order);
也不跳过空格。字面意思order
必须匹配下一个要读取的字符。
所以你可能想要" order = %d"
如果您想从上一行跳过换行符,但仍需要固定字符串上的文字匹配,喜欢这个问题 https://stackoverflow.com/questions/49923312/scanf-run-twice-instead-of-one-time-at-assembly-x86-64.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)