0

这是 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");
}

每当我执行这个程序时,输出如下: -

输入第一个字符
一种
一种
输入第二个字符


这是输出。如果我将 printf() 替换为 putchar() 并将 scanf() 替换为 getchar(),也会发生这种情况。为什么会这样?

4

4 回答 4

5

第一个将按下的结果scanf留在输入缓冲区中,因此您的第二个将获取它而不是从用户那里获取另一个字符。\nReturngetchar()\n

如果你想跳过那个换行符,你可以指示scanf“吃”它:

scanf("%c\n",&c);

或直接调用“吃掉它” getchar()

scanf("%c",&c);
getchar();

(请注意,这些并不完全相同,因为第二个片段会吃掉缓冲区中碰巧出现的任何字符,而第一个片段只有在它是 a 时才会删除它\n

于 2012-12-29T16:16:37.810 回答
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;
}
于 2015-06-24T09:27:51.320 回答
0

你得到了两个 a,因为你输入了一个回显到控制台的 a,然后你把它打印出来。

于 2012-12-29T16:16:23.143 回答
-2

使用前刷新标准输入getchar()..

在涡轮增压中,使用fflush()..

在 gcc 中,使用__fpurge(stdin)..(这在<stdio_ext.h>标题中可用)..

在扫描任何内容之前刷新标准输入将解决您的问题..

于 2012-12-29T16:16:17.857 回答