为什么我的第二个printf在预期时没有被调用?

时间:2013-10-30 19:15:42

标签: c input scanf getchar

我刚学会用C编程,对scanfgetchar的某些事情感到有些困惑。我理解使用scanf("%d", &i)之类的东西会读取整数输入,但在输入缓冲区中保留以下换行符(这就是为什么必须在使用{{1}之前通过查找getchar() == '\n'来清除输入缓冲区的原因在getchar电话之后。

这是我的简单(不正确)程序,它读取整数,然后是字符输入,并将它们打印回给用户:

scanf

如果我以我的int main(void) { int i; printf("Enter an integer: "); scanf("%d\n", &i); printf("Enter a char: "); char ch = getchar(); printf("You entered integer: %d\nYou entered character: %c\n", i, ch); return 0; } 格式字符串(因此只有scanf)关闭换行符,那么只要用户键入一个整数并点击输入该整数就会有意义读取并存储在"%d"中,程序将继续执行("输入字符:"立即打印,i存储换行符。

但是,格式为ch的字符串我遇到了意外的行为。当用户输入一个整数并点击输入时,我预计"输入一个字符:"打印。相反,你可以继续按Enter键,直到你决定输入一个不同的角色时才会发生任何事情。因此,您可以输入" 10",输入6次,然后键入" d"并且"%d\n"正确读取""。整个程序输出看起来像这样

getchar()

为什么我的程序在输入字符之前会停止?似乎奇怪的是,我的第二个Enter an integer: 10 d Enter a char: You entered integer: 10 You entered character: d 函数似乎是在调用printf之后调用的(因为字符读取是在#34之前输入的;输入一个字符:"得到打印)。

非常感谢任何帮助。我只是想在C中进一步理解这种细微差别。

3 个答案:

答案 0 :(得分:5)

scanf格式字符串中,任何空白字符序列都将匹配输入中的任何数量的空白区域。因此,\n将匹配任意数量的新行,scanf只会在遇到非空格字符时返回。

答案 1 :(得分:1)

我不确定,但您可以尝试这样的事情:

printf("Enter an integer: ");
scanf("%d\n", &i);
fflush(stdin);

答案 2 :(得分:1)

scanf docs(对于linux)说:

“一系列空格字符(空格,制表符,换行符等;请参阅isspace(3))。此指令在输入中匹配任意数量的空格,包括无空格。”

基本上\ n与逐字换行符不匹配,它匹配任何数量的空格,直到遇到非空白字符。

所以你的scanf("%d\n", &i)吃了所有的空格,直到它看到一个非空白字符才返回。您可以使用scanf("%d\t", &i)scanf("%d ", &i)

获得相同的效果