putchar()和printf()函数的交错

时间:2012-12-29 16:12:02

标签: c

这是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(),也会发生这种情况。为什么这开心呢?

4 个答案:

答案 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>标题中可用)..

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