CS50 pset3音乐分段错误

时间:2018-05-02 03:35:21

标签: c cs50

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

  由于分段错误,

无法执行程序

我个人认为这可能是因为将字符串转换为int或我从字符串中获取音符的方式。首先,我介绍了一个用于记录音符的字符串和一个用于记录音符的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';
}

更新

我在这里添加了完整的代码,以便您可以看到我想要做的事情。

2 个答案:

答案 0 :(得分:2)

我可以看到两个问题(假设stringchar*的typedef

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

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

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

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

答案 1 :(得分:0)

(代表作者提问回答)

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

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

现在它有效:)