我有以下程序:
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
数据类型上因为我在第1、2、3行中没有看到int
数据类型的问题对吗? 最佳答案
scanf()
函数在尝试分析字符以外的转换之前自动删除空白字符格式(主要是%c
;还有扫描集%[…]
-和%n
)是例外;它们不删除空白。
使用前导空白的" %c"
跳过可选空白不要在scanf()
格式字符串中使用尾随空白。
请注意,这仍然不会消耗输入流中剩余的任何尾随空格,甚至不会消耗到行尾,因此如果在同一个输入流上也使用getchar()
或fgets()
时,请小心我们只是让scanf在转换之前跳过空白,就像对%d
和其他非字符转换那样。
注意,除了转换之外的非空白“指令”(使用POSIX scanf terminology),比如scanf("order = %d", &order);
中的文本也不会跳过空白文本order
必须与要读取的下一个字符匹配。
因此,如果您想跳过前一行的换行符,但仍然需要固定字符串的文本匹配,like this question,则可能需要" order = %d"
。
关于c - scanf()将新行char留在缓冲区中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33624050/