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

标签 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;
}
.
.
.
.
<小时/>

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

编辑:这是哈佛大学在其类(class) CS50 中给出的问题的一部分。完整的程序使用了哈佛编写的几个相互依赖的文件。我的角色只是写下我在这里询问的片段。当然,我阅读并理解了他们提供的文件中的代码。恐怕我无法以一种无需太长即可验证的方式复制整个程序。我希望熟悉类(class)问题的人能够回答,或者仅在代码片段中就可以清楚地看出错误。不管怎样,谢谢你,我很抱歉不清楚。

最佳答案

您尝试将单个字符(似乎)传递给 atoi函数,当它需要一个空终止字节字符串时。

C 中的所有字符串都必须以空字符 '\0' 终止。如果该终止符不存在,字符串函数将不知道字符串在哪里结束,并超出范围,这将导致 undefined behavior .

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

<小时/>

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

关于CS50:pset3 音乐 (C) 的持续时间部分出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51646279/

相关文章:

c - 尝试使用 Open Function 调用时出现错误消息

c++ - 为什么我可以使用 POSIX 创建一个比安装在/dev/shm 上的大小更大的共享内存?

c - 如何为 arm 平台开始交叉编译

c - 为什么printf会打印我分配给int空间的空间数?

c - .c 和 .h 文件扩展名对 C 意味着什么?

c - 用阿基米德方程逼近 Pi

c - MPI:取消非阻塞发送

c - 我怎样才能使变量盐在 C 的 crypt 函数中使用?

打印输出的 cs50 首字母缩写错误

c - 为什么模运算符不能在 C 中的 printf 函数中工作?