基本的scanf语句错误

时间:2016-10-03 04:19:50

标签: c if-statement

我正在编写一个基本程序来告诉用户他们是否已经收到足够的睡眠。然而,无论进入多少小时,它总是会显示“睡眠不足”的第一条消息,即使他们已经睡了10个小时。

double hoursOfSleep;

printf("Please enter the amount of hours of sleep you received last night:\n");
scanf("%f", &hoursOfSleep);

if (hoursOfSleep <= 4){
    printf("Sleep deprived!\n");}
else if (hoursOfSleep <= 6){
    printf("You need more sleep.\n");}
else if (hoursOfSleep <= 8){
    printf("Not quite enough.\n");}
else
    printf("Well Done!\n");

4 个答案:

答案 0 :(得分:4)

尝试这样的事情:

scanf("%lf",&hoursOfSleep);

由于您指定了%f,因此您告诉scanf()期待float *,但您传递了double *。使用"%lf"指定您请求双精度值(传递double *)。

答案 1 :(得分:2)

这是因为您在scanf()中有浮点数的格式说明符。您应该使用%lf作为双倍的内容:

scanf("%lf", &hoursOfSleep);

如果格式说明符与printf()scanf()中的变量类型不匹配,则会产生意外结果。当我在系统上运行代码时输入6时,float hoursOfSleep保持值0.000000。

通过启用某些编译器警告,可以在编译时捕获此类问题。例如,我总是至少有:

gcc nosleep.c -Wall -o nosleep

-Wall开关启用了几个警告,第二个我编译了你的代码,我可以看到出了什么问题。事实上,我建议您尝试使用-Wall开关编译损坏的代码,看看会发生什么。这种事情一直在发生;很容易忘记printf()右侧的其中一个变量,并在启用警告的情况下立即找到它。

答案 2 :(得分:1)

正如其他人已经提到的那样,使用%lf时,您必须使用double scanf。这有点令人困惑,因为双打用%f打印,但这是怎么回事。

我要添加的内容是:始终检查scanf

返回的值

如果用户输入的内容不是双精度数,则您当前的代码具有未定义的行为。至少这样做:

if (scanf("%lf", &hoursOfSleep) != 1)
{
    // Add error handling here
    hoursOfSleep = 8;  // At least initialize the variable...
}

更好的方法可能是:

char input[100];
while(1)
{
    printf("Please enter the amount of hours of sleep you received last night:\n");
    if (fgets(input, 100, stdin) == NULL)
    {
        printf("stdin error\n");
        return -1;
    }

    if (sscanf(input, "%lf", &hoursOfSleep) == 1)
    {
        // Got a double - break the loop
        break;
    }
}

答案 3 :(得分:0)

您正在使用%f来获取输入double值。 %f用于浮点数。对于double,它是%lf。

scanf("%lf", &hoursOfSleep);

%d for int

%c代表char

%s表示字符串

%lld for long long int