我有以下程序:
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
数据类型的这个问题 . 是不是?
3 回答
scanf()函数在尝试解析字符以外的转换之前会自动删除空格 . 字符格式(主要是
%c
;也是扫描集%[…]
- 和%n
)是例外;他们不删除空格 .使用带有前导空格的
" %c"
可跳过可选空格 . 不要在scanf()
格式字符串中使用尾随空白 .请注意,这仍然不会消耗输入流中留下的任何尾随空格,甚至不会消耗到行的末尾,因此如果在同一输入流上也使用getchar()或fgets(),请注意这一点 . 我们只是让scanf在转换之前跳过空格,就像
%d
和其他非字符转换一样 .请注意,除了转换之外的非空白"directives"(使用POSIX scanf terminology),如
scanf("order = %d", &order);
中的文字文本也不会跳过空格 . 文字order
必须匹配要读取的下一个字符 .所以你可能想要
" order = %d"
,如果你想跳过前一行的换行,但仍然需要一个固定字符串的文字匹配,like this question .使用
scanf(" %c", &c2);
. 这将解决您的问题 .在调用第二个
scanf()
之前使用getchar()
.