我是初学者程序员(大约一周),我的简单程序一直在崩溃。我做错了什么?在我输入小时数之前它崩溃了。请帮忙。
#include <stdio.h>
#include <stdlib.h>
int hours;
float wage;
float total[2];
int main()
{
printf("How many hours have you worked this week?\n");
fgets(hours, sizeof(hours), stdin);
sscanf(hours,"%d", &wage);
if (hours < 40)
wage = 8.5;
total[0] = hours * wage;
printf("You will earn %d dollars", total[0]);
if (hours >= 40)
wage = 12.75;
total[1] = hours * wage;
printf("You will earn %d dollars", total[1]);
return 0;
}
答案 0 :(得分:2)
我认为问题在于:
fgets(hours, sizeof(hours), stdin);
fgets
不执行格式化输入,因此它会以Cruel和Unusual Ways崩溃,因为它会尝试使用整数值hours
作为指向应该读取的缓冲区的指针。
要解决此问题,请尝试以下操作:
scanf("%d", &hours);
下一行还有一个完全不必要且格式错误的scanf
:
sscanf(hours,"%d", &wage);
scanf
的语法是
scanf(formatting-string, destinations...);
因此,它应该看起来像这样:
scanf("%f", &wage);
你绝对应该提高编译器的警告级别;令我惊讶的是,这编译时没有给你一个警告,解释了一些可疑的东西。
printf
语句中的格式说明符也存在问题:
printf("You will earn %d dollars", total[0]);
请注意,total[0]
是float
,而不是int
,因此%d
不合适。请尝试使用%f
。
希望这有帮助!
答案 1 :(得分:2)
hour
已定义为int
,但您使用fgets
对其进行初始化,该scanf("%d", &hours);
用于输入字符串。
使用
%f
在所有%d
语句中也使用printf
代替sscanf
,{{1}}也是如此,否则您的程序行为将未定义。
如果转换规范无效,则行为未定义.282)如果有任何参数 不是相应转换规范的正确类型,行为是 未定义。
答案 2 :(得分:1)
http://www.cplusplus.com/reference/cstdio/fgets/
fgets获取一个char指针作为第一个参数...你给一个int。这就是崩溃的原因
答案 3 :(得分:0)
fgets
期望它的第一个参数是指向char
数组的第一个元素的指针,它将保存输入。例如:
char hoursBuf[4]; //room for 3 digits plus 0 terminator
if ( !fgets( hoursBuf, sizeof hoursBuf, stdin ))
{
// error on input; you really want to verify that your library calls
// succeed before moving on.
}
这会将输入保存为字符串或字符序列;为了使用它执行计算,您必须使用其他函数(如strtol
或sscanf
)将其转换为整数类型。
您可以直接使用scanf
来避免转换步骤:
if ( scanf( "%d", &hours ) == 1 )
{
...
}
scanf
将返回成功转换和分配的次数;在上面的例子中,它应该是1.如果它是0,那么用户键入除有效整数之外的其他东西。但是,如果他们输入类似&#34; 12w&#34;的内容,scanf
将转换并分配&#34; 12&#34;到hours
,返回1,并在输入流中保留w
以填充下一个输入。
我更喜欢使用strtol
因为它捕获了这些情况:
char *chk; // will point to the first character not converted
int tmp = (int) strtol( hoursBuf, &chk, 10 );
if ( !isspace( *chk ) && *chk != 0 )
{
// *chk is not whitespace or 0, meaning the user typed an invalid character
fprintf( stderr, "%s is not a valid integer string\n", hoursBuf );
}
else
{
// input was good, so we assign hours:
hours = tmp;
}
我知道对于那些已经编程了大约一周的人来说,这是很重要的。 C中的I / O可以 &#34;简单&#34;或者&#34;健壮的&#34 ;;你不能两者兼而有之。