在C语言中使用scanf()连续读取两个字符。

4
我正在尝试从用户处获取两个字符,重复次数为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个回答

10
问题在于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
...或者你可以在 scanf%c 前面加一个空格---> scanf(" %c", &a) - haccks
1
@haccks 是的,没错,我会把这个加到我的回答里 - 感谢你的提示 ;) - Filipe Gonçalves
仅在循环前添加 getchar 是不起作用的。然而,在循环开始和结束处添加 getchar 在这种情况下是有效的。 - coder_r
@babji 是的,在循环之前仅使用 getchar() 是行不通的。我意识到了这一点,但后来编辑了我的答案,忘记删除这部分。感谢您的注意,我现在已经将其删除了。 - Filipe Gonçalves
@FilipeGonçalves:谢谢,读了你精彩的回答后学到了新知识。 - Destructor

0

从你的代码来看,它是完美的,应该读取 T 次 A 和 B,但每次 for each 循环都会替换 A 和 B。

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


这个问题只涉及输入,而不是处理a和b,所以你回答的是另一个问题,而不是这个问题。 - Rob11311
抱歉,我没有理解你的问题。希望这可以帮到你。 - Saiteja prasadam

0

scanf 使用的一些格式会从 stdin 中删除换行符,但其他格式则不会。使用 "%d" 进行读取属于后者。在读取之前,您需要先读取一个换行符 '\n'

scanf("%c", &a);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接