我包含了正确的库和所有内容,这部分代码由于某种原因给出了段错误:
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;
}
.
.
.
.
<小时/>
它有效。
我很困惑,我想使用第一种方法,因为它效率更高。
编辑:这是哈佛大学在其类(class) CS50 中给出的问题的一部分。完整的程序使用了哈佛编写的几个相互依赖的文件。我的角色只是写下我在这里询问的片段。当然,我阅读并理解了他们提供的文件中的代码。恐怕我无法以一种无需太长即可验证的方式复制整个程序。我希望熟悉类(class)问题的人能够回答,或者仅在代码片段中就可以清楚地看出错误。不管怎样,谢谢你,我很抱歉不清楚。
最佳答案
您尝试将单个字符(似乎)传递给 atoi
函数,当它需要一个空终止字节字符串时。
C 中的所有字符串都必须以空字符 '\0'
终止。如果该终止符不存在,字符串函数将不知道字符串在哪里结束,并超出范围,这将导致 undefined behavior .
如果您有一个数字字符,并且想要将其转换为与该数字对应的整数值,有一个简单的技巧:减去字符'0'
。如fraction[0] - '0'
。这将为您提供 fraction[0]
中数字的整数值。
在对用户输入值进行除法之前,请确保分母不零。
关于CS50:pset3 音乐 (C) 的持续时间部分出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51646279/