基本scanf语句错误

基本scanf语句错误,c,if-statement,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("Sl

我正在编写一个基本程序,告诉用户他们是否得到了足够的睡眠。然而,无论输入多少小时,即使他们已经睡了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");
双小时睡眠;
printf(“请输入您昨晚的睡眠时间:\n”);
扫描频率(“%f”、&hoursofsheep);

如果(睡眠时间尝试以下方法:

scanf("%lf",&hoursOfSleep);

因为您指定了
%f
,所以您告诉
scanf()
期望一个
float*
,但您传递了一个
double*
。使用
%lf
指定您正在请求一个双精度值(传递
double*
).

这是因为您的
scanf()
中有一个浮点数格式说明符。您应该使用
%lf
作为双精度:

scanf("%lf", &hoursOfSleep);
当您不将格式说明符与
printf()
scanf()
中的变量类型匹配时,将产生意外结果。当我在系统上运行代码时输入6时,
float hoursOfSleep
的值为0.000000

通过启用某些编译器警告,可以在编译时发现此类问题。例如,我始终至少有:

gcc nosleep.c -Wall -o nosleep

-Wall
开关启用了多个警告,在我编译代码的第二天,我就可以看到错误所在。事实上,我建议您尝试使用
-Wall
开关编译损坏的代码,看看会发生什么。这种情况一直在发生;很容易忘记右侧的一个变量e> printf()
,如果启用了警告,您可以立即找到它。

正如其他人已经提到的,在使用
scanf
时,您必须将
%lf
用于
double
。这有点令人困惑,因为double是用
%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;
    }
}

您正在使用%f获取输入的双精度值。%f用于浮点数。对于双精度值,它是%lf

scanf("%lf", &hoursOfSleep);
%d代表整数

%c代表字符

%s代表字符串


%lld for long long int

无需复制:您是否考虑过打印出睡眠小时数的值,以便您可以看到程序得到了什么,并可以将其与您认为程序应该得到的值进行比较?这是最基本的调试技术(打印输入以供检查)。这也会告诉您问题所在-您的代码没有正确读取输入。这也是您可以而且应该检查是否使用调试器而不是打印作为调试技术的原因。许多启用了警告功能的编译器会警告
double hoursOfSleep;…scanf(“%f”,&hoursOfSleep);
通过完全启用编译器的警告或查找新的编译器,您可以节省时间。%lf指定您正在请求double@AndrewL.你明白了。@J.MarcosHernandezQ。你可以,也应该,编辑你的答案来改进它,而不是留下评论。这次我为你添加了材料,但你应该自己做将来。关于检查
scanf()
的返回值的好建议,但我想指出,在这种情况下,这不会有帮助,因为当您输入任何数字时会返回1,即返回值与输入绑定,而不是与存储变量的类型绑定。@DavidBowling-of-cause OP应该首先修复格式说明符。