使用scanf()进行用户输入时出错

时间:2010-08-28 17:06:44

标签: c

使用scanf()将数据存储到联合中时,我遇到了一个奇怪的问题。

这是我的代码

#include <stdio.h>

union Student
{
    float score;
    char grade;
};

int main(void)
{
    union Student jack;

    printf("Enter student score : ");
    scanf("%f", &jack.score);
    printf("Score : %f", jack.score);

    jack.score=0;

    printf("Enter student grade : ");
    scanf("%c", &jack.grade);
    printf("Grade : %c", jack.grade);

}

我得到以下输出

searock@searock-desktop:~/Desktop$ ./union
Enter student score : 12
Score : 12.000000Enter student grade : Grade :

但如果我将代码更改为:

#include <stdio.h>

union Student
{
    float score;
    char grade;
};

int main(void)
{
    union Student jack;

    printf("Enter student grade : ");
    scanf("%c", &jack.grade);
    printf("Grade : %c\n", jack.grade);

    printf("Enter student score : ");
    scanf("%f", &jack.score);
    printf("Score : %f\n", jack.score);

}

它给出了确切的输出[正确的输出]。我知道这不是一个很好的例子,但有人可以解释我出了什么问题吗?

修改后的代码:在格式字符串之前添加\ n。 [scanf(“\ n%c”,&amp; ch);]

#include <stdio.h>

    union Student
    {
        float score;
        char grade;
    };

    int main(void)
    {
        union Student jack;

        printf("Enter student score : ");
        scanf("%f", &jack.score);
        printf("Score : %f", jack.score);

        jack.score=0;

        printf("Enter student grade : ");
        scanf("\n%c", &jack.grade);
        printf("Grade : %c", jack.grade);

    }

3 个答案:

答案 0 :(得分:2)

区别在于字符串中的\n。这些可以防止字符串缓存在输出缓冲区中,而是立即显示在屏幕上。

答案 1 :(得分:2)

在第一个示例中,第一个scanf()读取的数字最多但不包括换行符(假设您不键入空格和换行符;如果这样做,它将继续等待输入,直到您提供数字或非数字 - 其中空格等不算数字或非数字)。然后带有“scanf()”格式说明符的第二个%c不会跳过空格(与大多数其他格式说明符不同)并读取换行符(假设您在数字结束后立即键入换行符;如果你键入了别的东西 - 白色空格或字母,也许,它读取那个字符),完全忽略你在第二行输入的任何内容。 (实际上,当我运行代码时,它不会等待我为第二批输入输入任何内容。尝试输入“3.14 + C”或“3.14C”和换行符。)

在第二个示例中,第一个scanf()读取第一个字符。第二个scanf()跳过空白区域,包括换行符,直到找到一个数字或某个绝对不是数字的内容(如字母)。

这是大多数人避免scanf()的原因的美丽示范;很难对它提供令人满意的控制。你最好阅读行(可能使用fgets();绝对不使用gets()),然后用sscanf()解析它们。然后,您将获得两个示例的理智行为。

请注意,您的问题与使用union完全无关;你的代码在工作方式上很好。您的问题与scanf()

的使用密切相关

次要建议:当打印输出行时 - 除了提示之外 - 在格式字符串的末尾包含换行符。

答案 2 :(得分:1)

在第一个示例中,您读取一个浮点数,然后读取下一个字符,该字符将是浮点数之后的换行符(您在输入浮点数后按Enter键)。

在第二个示例中,scanf()格式说明符包含该换行符,因此第一个scanf()读取一个字符后跟一个换行符,第二个scanf()读取一个浮点数后跟一个换行符。