我只是在学习用 C 编程,对 and 发生的事情有点scanf
困惑getchar
。我知道使用类似的东西scanf("%d", &i)
会读取一个整数输入,但会在输入缓冲区中留下以下换行符(这就是为什么必须在调用后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
存储换行符)。
但是,使用 String 的格式时,"%d\n"
我遇到了意外的行为。当用户输入一个整数并按回车键时,我希望打印“输入一个字符:”。相反,您可以继续按 Enter 键,直到您决定输入不同的字符之前什么都不会发生。因此,您可以输入“10”,按回车键 6 次,然后输入“d”并getchar()
“正确”读取。整个程序输出看起来像这样
Enter an integer: 10
d
Enter a char: You entered integer: 10
You entered character: d
为什么我的程序在输入字符之前一直停止?printf
我的第二个函数似乎在调用之后被调用,这似乎很奇怪getchar
(因为在“输入字符:”被打印之前输入了读取的字符)。
任何帮助将不胜感激。我只是想进一步了解 C 中的这种细微差别。