CS50:pset3(音乐)的持续时间部分中的分段错误(C)

时间:2018-08-02 05:43:28

标签: c cs50

我包括了适当的库,并且所有这部分代码由于某些原因导致了分段错误:

int numerator = atoi(&fraction[0]);  
int denominator = atoi(&fraction[2]);  
return ((numerator / denominator) * 8);

如果我选择不使用atoi()转换为int,而是执行一堆if语句,如下所示:

if (fraction[0] == '1' && fraction[2] == '8')
{
    return 1;
}

else if (fraction[0] == '1' && fraction[2] == '4')
{
    return 2;
}
.
.
.
.

有效。
我很困惑,我想使用第一种方法,因为它效率更高。

编辑:这是哈佛在其CS50课程中提出的问题的一部分。完整程序使用哈佛编写的几个文件,这些文件相互依赖。我的角色只是写我在这里询问的摘录。当然,我阅读并理解了它们提供的文件中的代码。恐怕我无法在不花费很长时间的情况下以一种可验证的方式复制整个程序。我希望熟悉该课程的问题的人能够回答,或者仅在摘要中就可以清除错误。谢谢,无论如何,我对此表示歉意。

2 个答案:

答案 0 :(得分:0)

当它想要一个 以空字符结尾的 字节字符串<时,您尝试将单个字符(似乎)传递给atoi函数。 / em>。

C中的所有字符串都必须以空字符 '\0'结尾。如果该终止符不存在,则字符串函数将不知道字符串在何处结束,并且越界将导致undefined behavior

如果您有一个数字字符,并且想要将其转换为与数字相对应的整数值,则有一个简单的技巧:减去字符'0'。与fraction[0] - '0'中一样。这将为您提供fraction[0]中数字的整数值。


在用用户输入的值进行除法之前,请确保分母不是

答案 1 :(得分:0)

您正在执行integer division,这并没有给您带来您期望的结果。

特别是:

(1 / 8) * 8 == (0) * 8 == 0

而不是1。同样:

(1 / 4) * 8 == (0) * 8 == 0

而不是2

我怀疑从您的函数返回0会导致调用代码中出现分段错误。您可以通过在备用代码中返回0来进行验证,以查看它是否还会产生分段错误。

为了获得您期望的结果,一种方法是:

return (int) ((((double) numerator) / denominator) * 8);