【问题标题】:Read two characters consecutively using scanf() in C在 C 中使用 scanf() 连续读取两个字符
【发布时间】:2014-06-07 17:44:56
【问题描述】:

我尝试输入来自用户t 的两个字符的次数。这是我的代码:

int main()
{
    int t;
    scanf("%d",&t);
    char a,b;

    for(i=0; i<t; i++)
    {
        printf("enter a: ");
        scanf("%c",&a);

        printf("enter b:");
        scanf("%c",&b);
    }
    return 0;
}

奇怪的是第一次的输出是:

enter a: 
enter b:

也就是说,代码不会等待a的值。

【问题讨论】:

    标签: c input character scanf input-buffer


    【解决方案1】:

    问题是scanf("%d", &amp;t) 在输入缓冲区中留下了一个换行符,它只被scanf("%c", &amp;a) 使用(因此a 被分配了一个换行符)。您必须使用 getchar(); 使用换行符。

    另一种方法是在scanf() 格式说明符中添加一个空格以忽略前导空白字符(这包括换行符)。示例:

    for(i=0; i<t; i++)
    {
        printf("enter a: ");
        scanf(" %c",&a);
    
        printf("enter b: ");
        scanf(" %c",&b);
    }
    

    如果您更喜欢使用 getchar() 来使用换行符,则必须执行以下操作:

    for(i=0; i<t; i++)
    {
        getchar();
        printf("enter a: ");
        scanf("%c",&a);
    
        getchar();
        printf("enter b:");
        scanf("%c",&b);
     }
    

    我个人认为前一种方法更好,因为它忽略任意数量的空格,而getchar() 只消耗一个。

    【讨论】:

    • ...或者你可以在scanf中的%c之前放置一个空格---> scanf(" %c", &amp;a)。
    • @hacks 是的,是的,我会将其添加到我的答案中 - 感谢您的提示;)
    • 只是在循环之前添加 getchar 不起作用..但是在这种情况下,在循环开始和循环结束时添加 getchar 是可行的。
    • @babji 是的,使用 getchar()before 循环将不起作用。我意识到了这一点,但随后编辑了我的答案并忘记删除这部分。不过感谢您的注意,我现在已将其删除。
    • @FilipeGonçalves:谢谢,看了你的精彩回答后知道了一些新的东西。
    【解决方案2】:

    通过查看您的代码,它是完美的,它应该读取 T 次 A 和 B,但每次循环时它都会替换 A 和 B。

    使用数组或哈希表进行有效存储

    【讨论】:

    • 问题只是关于输入,而不是处理 a 和 b,所以你回答的是不同的问题,而不是这个问题。
    • 抱歉没有收到您的问题希望对您有所帮助
    【解决方案3】:

    与scanf 一起使用的某些格式会从stdin 修剪换行符,但其他格式则不会。使用"%d" 阅读属于后一类。在读入

    之前你需要读一个换行符'\n'
    scanf("%c", &a);
    

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多