首页 文章

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

提问于
浏览
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");
    }

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

Enter the first character
a
a
Enter the second character

这是输出 . 如果我用putchar()替换printf()和用getchar()替换scanf(),也会发生这种情况 . 这为什么开心呢?

4 回答

  • 5

    第一个 scanf 在输入缓冲区中留下__返回按下的 \n ,因此您的第二个 getchar() 将获取此 \n 而不是从用户获取另一个字符 .

    如果要跳过该换行符,可以指示 scanf 到"eat":

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

    或"eat it"直接拨打 getchar()

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

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

  • 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;
    }
    
  • 0

    你得到两个,因为你键入一个回显到控制台,然后你打印出来 .

  • -2

    在使用getchar()之前刷新stdin ..

    在turbo中,使用fflush()..

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

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

相关问题