CS50 pset3 音乐分段错误

CS50 pset3 Music segmentation fault

今天我完成了音乐项目,或者至少我认为我已经完成了。 在 helper.c 上,当我 运行 make 它同时制作音符和合成器文件并且没有错误。但是当我想 运行 ./notes 时,它给了我分段错误。即使我 运行 带有 check50 的程序也给了我这个错误:

failed to execute program due to segmentation fault

我个人认为可能是因为把string转成int或者我从string中获取音符的方式。首先,我引入了一个字符串用于记笔记,一个整数用于记笔记的 ovtav。

字符串音符类似于 D4 或 C#4

所以我只复制这部分,以检查我是否正确完成。

string noteletter="";
int noteoctav;
if (strlen(note) == 3)
{
    noteletter[0] = note[0];
    noteletter[1] = note[1];
    noteoctav = note[2] - '0';
}
if (strlen(note)== 2)
{
    noteletter[0] = note[0];
    noteoctav = note[1] - '0';
}

更新

我在这里添加了完整的代码,因此您可以看到我正在尝试做什么。

我可以看到两个问题(假设 stringchar* 的类型定义)

如果noteletter的长度为0(值= "")那么你认为noteletter[1]在做什么?

即使 noteletter 设置为更大的值(例如 noteletter = "ABC";)- 写入文字字符串也是未定义的行为。

尝试 char noteletter[3] = { 0 }; 获得(快速浏览)看起来足够大的东西。

另一个可能的问题:如果 noteNULL 或无效,则 strlen(note) 不安全。

(代表问题作者发布答案)

我的问题是我将 noteletter 定义为字符串。我将该部分更改为

char noteletter[4];
int noteoctav;
if (strlen(note) == 3)
{
    noteletter[0] = note[0];
    noteletter[1] = note[1];
    noteletter[2] = '[=10=]';
    noteoctav = note[2] - '0';
}
if (strlen(note)== 2)
{
    noteletter[0] = note[0];
    noteletter[1] = '[=10=]';
    noteoctav = note[1] - '0';
}

现在可以使用了:)