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