这是K& R中给出的一个声明,printf()和putchar()可以交错。如果是,那么为什么下面的代码没有给出所需的输出: -
#include"stdio.h" void main() { char c,d; printf("Enter the first character\n"); scanf("%c",&c); printf("%c\n",c); printf("Enter the second character\n"); d=getchar(); putchar(d); printf("\n"); }
每当我执行此程序时,输出如下: -
Enter the first character a a Enter the second character
这是输出。如果我用putchar()替换printf()和用getchar()替换scanf(),也会发生这种情况。为什么这开心呢?
答案 0 :(得分:5)
第一个scanf
在返回按下的输入缓冲区中留下\n
,因此您的第二个getchar()
将获得此\n
而不是从用户那里获取另一个角色。
如果你想跳过那个换行符,你可以指示scanf
“吃掉”它:
scanf("%c\n",&c);
通过拨打getchar()
直接或“吃掉”:
scanf("%c",&c);
getchar();
(请注意,这些并不完全等效,因为第二个片段会吃掉碰巧在缓冲区中出现的任何字符,而第一个片段只有当它是\n
时才会删除
答案 1 :(得分:1)
您可以像这样更正您的代码:
#include <stdio.h>
int main() {
char c, d;
printf("Enter the first character\n");
scanf("%c\n", &c); // Ask scanf to read newline and skip
printf("%c\n", c);
printf("Enter the second character\n");
d = getchar();
putchar(d);
printf("\n");
return 0;
}
答案 2 :(得分:0)
你得到两个,因为你输入一个回显到控制台,然后你打印出来。
答案 3 :(得分:-2)
在使用getchar(
)之前刷新stdin ..
在turbo中,使用fflush()
..
在gcc中,使用__fpurge(stdin)
..(这在<stdio_ext.h>
标题中可用)..
在扫描任何内容之前刷新标准输入将解决您的问题..