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';
}
更新
我在这里添加了完整的代码,因此您可以看到我正在尝试做什么。
我可以看到两个问题(假设 string
是 char*
的类型定义)
如果noteletter
的长度为0(值= ""
)那么你认为noteletter[1]
在做什么?
即使 noteletter
设置为更大的值(例如 noteletter = "ABC";
)- 写入文字字符串也是未定义的行为。
尝试 char noteletter[3] = { 0 };
获得(快速浏览)看起来足够大的东西。
另一个可能的问题:如果 note
为 NULL
或无效,则 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';
}
现在可以使用了:)
今天我完成了音乐项目,或者至少我认为我已经完成了。 在 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';
}
更新
我在这里添加了完整的代码,因此您可以看到我正在尝试做什么。
我可以看到两个问题(假设 string
是 char*
的类型定义)
如果noteletter
的长度为0(值= ""
)那么你认为noteletter[1]
在做什么?
即使 noteletter
设置为更大的值(例如 noteletter = "ABC";
)- 写入文字字符串也是未定义的行为。
尝试 char noteletter[3] = { 0 };
获得(快速浏览)看起来足够大的东西。
另一个可能的问题:如果 note
为 NULL
或无效,则 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';
}
现在可以使用了:)