scanf()将新的行字符留在缓冲区中

我有以下程序:

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行,以便用户input数据,而是将新的行字符存储在c2并移动到第5行。

是对的吗?

但是,这是否只发生在char数据types? 因为我没有看到这样的问题int数据types在行1,2,3,是吗?

在尝试parsing除字符以外的东西之前, scanf()函数会自动删除空格。 字符格式(主要是%c ;扫描集%[…]%n )是例外; 他们不删除空格。

使用前导空白的" %c"跳过可选的空格。 不要在scanf()格式的string中使用尾随空格。

请注意,这仍然不会消耗inputstream中留下的任何尾随空格,甚至不会消耗到行的末尾,所以要注意,如果在同一个inputstream上也使用getchar()fgets() 。 我们只是让scanf 转换之前跳过空格,就像%d和其他非字符转换一样。

使用scanf(" %c", &c2); 。 这将解决您的问题。