scanf存在问题

4
为什么 scanf("%c", &letter); 不起作用,其余的正常工作?
可能是重复问题:
简单的C scanf不起作用?
#include <stdio.h>

main(){
    int number;
    float number1;
    char letter;
    char letter2 [5];

    printf("Enter an int: ");
    scanf("%d", &number);
    printf("Enter a float: ");
    scanf("%f", &number1);
    printf("Enter a letter: ");
    scanf("%c", &letter);
    printf("Enter a string: ");
    scanf("%s", letter2);

    printf("INT = %d\n", number);
    printf("FLOAT = %f\n", number1);
    printf("LETTER = %c\n", letter);
    printf("LETTER2= %s\n", letter2);

    getch();
}

1
看起来是正确的。你得到了什么结果? - Vladimir Ivanov
你所说的“不工作”是指什么?程序崩溃了吗?还是printf输出的结果不是你想要的?那么最终的结果是什么? - Vladimir Ivanov
2
我认为 scanf 会将 \n 留在缓冲区中,导致 letter 变成了 \n。不过我不确定。 - khachik
1
从样本中看,Khachik 在这方面是正确的。老实说,我在 10 年的 C 编程历程中从未使用过 scanf()。在这种情况下,最好在 stdin 上执行 fgets() 并使用 atoi 或某些类似函数。其中一个优点是您可以对输入执行检查以确保它是正确/符合您的期望的。 - AlastairG
1
可能是Simple C scanf does not work?的重复问题(还有其他几个 - 尝试在SO中搜索scanf)。 - The Archetypal Paul
显示剩余4条评论
2个回答

4
这是因为在输入float后换行符(回车键)被计算为一个字符。
这不是一个bug,而是由于"\n"在C语言中被视为一个字符,如果您想要忽略它,需要手动处理。
对于您的情况,最简单的解决方案是消耗掉换行符,如下所示:
scanf("%f", &number1);
getchar();

This Link will help.


不是, 请查看保罗在评论中提供的链接,你的问题是另一个问题的重复。 - Bobby
@c是最强大的语言,这就是为什么它被用于设备驱动程序的原因。你怎么能说c有问题呢? - Ishu

3

scanf 会读取前一行缓冲区中留下的空格。为了跳过这些空格,可以在 scanf 中添加一个空格:

scanf(" %c", &letter);

空格表示“跳过空格”,%c 表示“读取接下来的字符”。

这是C语言中的一个bug吗?还是它有其他用途? - sample
1
C语言不可能有bug,因为它不是一个程序,而是一种语言。并且,这就是它的设计初衷。 - Yakov Galka
@sample no - khachik

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