使用C中的scanf()连续读取两个字符

时间:2014-06-07 17:44:57

标签: c input character scanf input-buffer

我正在尝试从用户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的值。

3 个答案:

答案 0 :(得分:7)

问题是scanf("%d", &t)在输入缓冲区中留下了一个换行符,该换行符仅由scanf("%c", &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()只消耗一种空格。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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