-1

我是一名初级程序员(大约一周),我的简单程序不断崩溃。我做错了什么?在我输入小时数之前它就崩溃了。请帮忙。

#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;
}
4

4 回答 4

2

我认为问题在这里:

fgets(hours, sizeof(hours), stdin);

fgets不做格式化输入,所以这最终会以残忍和不寻常的方式崩溃,因为它试图使用整数值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]是 a float,而不是int,所以%d是不合适的。尝试%f改用。

希望这可以帮助!

于 2013-11-11T19:45:27.090 回答
2

hour已定义int,但您正在初始化它fgets用于输入字符串。
利用

scanf("%d", &hours);   

也可以在你的所有语句中使用%f而不是,否则你的程序行为将是Undefined%dprintfsscanf

7.21.6 格式化输入/输出函数

如果转换规范无效,则行为未定义。282) 如果任何参数不是相应转换规范的正确类型,则行为未定义。

于 2013-11-11T19:45:28.980 回答
1

http://www.cplusplus.com/reference/cstdio/fgets/

fgets 获取一个 char 指针作为第一个参数......你给一个 int。这就是它崩溃的原因

于 2013-11-11T19:46:05.080 回答
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. 
}

这会将输入保存为字符串或字符序列;为了使用它执行计算,您必须使用另一个函数(如strtolor )将其转换为整数类型sscanf

您可以通过scanf直接使用来避免转换步骤:

if ( scanf( "%d", &hours ) == 1 )
{
  ...
}

scanf将返回成功转换和分配的数量;在上面的例子中,它应该是 1。如果它是 0,那么用户输入的不是一个有效的整数。但是,如果他们输入类似“12w”的内容,scanf则会将“12”转换并分配给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 可以“简单的”或“稳健的”;你两个都得不到。

于 2013-11-11T20:23:47.837 回答