我正在尝试编写一个简单的代码来解决莫尔斯电码。但是,尽管我使用malloc来分配内存,但我还是遇到了分段错误(核心转储(。我不明白为什么我会出现分段错误。我该如何解决这个问题?
我的代码是
const char *morse[55] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", ".-.-.-", "--..--", "..--..", ".----.", "-.-.--", "-..-.", "-.--.", "-.--.-", ".-...", "---...", "-.-.-.", "-...-", ".-.-.", "-....-", "..--.-", ".-..-.", "...-..-", ".--.-.", "...---..."};
const char *ascii[55] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", ",", "?", "'", "!", "/", "(", ")", "&", ":", ";", "=", "+", "-", "_", """, "$", "@", "SOS"};
char *decode_morse(const char* morse_code)
{
int c1;
char *str;
char *result;
int c2;
int i;
int j;
i = 0;
j = 0;
c1 = 0;
result = (char *)malloc(sizeof(char) * strlen(morse_code));
str = (char *)malloc(9 * sizeof(char) +1);
while (morse_code[c1] != ' ')
{
while (morse_code[c1] == '.' || morse_code[c1] == '-')
{
c2 = 0;
while (morse_code[c1] != ' ')
{
str[c2] = morse_code[c1];
c1++;
c2++;
}
while (strcmp(str,morse[i]) != 0)
{
i++;
if (strcmp(str,morse[i]) == 0)
result[j++] = ascii[i][0];
}
}
c1++;
result[j++] = ' ';
}
return (result);
}
int main()
{
printf("%sn", decode_morse(".... . -.-- .--- ..- -.. ."));
}
请注意,我不是C开发专家。
我只懂一点C++,但让我试着帮你。我可以看到你的代码中有一些错误
见下面我的修复意见
const char *morse[55] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", ".-.-.-", "--..--", "..--..", ".----.", "-.-.--", "-..-.", "-.--.", "-.--.-", ".-...", "---...", "-.-.-.", "-...-", ".-.-.", "-....-", "..--.-", ".-..-.", "...-..-", ".--.-.", "...---..."};
const char *ascii[55] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", ",", "?", "'", "!", "/", "(", ")", "&", ":", ";", "=", "+", "-", "_", """, "$", "@", "SOS"};
char *decode_morse(const char* morse_code)
{
int c1;
char *str;
char *result;
int c2;
int i;
int j;
i = 0;
j = 0;
c1 = 0;
result = (char *)malloc(sizeof(char) * strlen(morse_code));
str = (char *)malloc(9 * sizeof(char) +1);
while (morse_code[c1] != ' ')
{
while (morse_code[c1] == '.' || morse_code[c1] == '-')
{
c2 = 0;
while (morse_code[c1] != ' ')
{
str[c2] = morse_code[c1];
c1++;
c2++;
}
// you need to reset the value of i here
i = 0;
while (strcmp(str,morse[i]) != 0)
{
// there is a possibility that morse DOES NOT contain str
// in that case i will get out of bound and that's where you get the segmentation fault
// in you original case, this is probably caused by the bug below where you don't reset 'str'
// resulting in str being something that is not even valid morse in the first place
i++;
if (strcmp(str,morse[i]) == 0)
result[j++] = *ascii[i];
}
// you are assigning the char being read to the variable 'str' without ever resetting 'str'
// imagine if you get .... and .- then your str will be .-.. for that character
// since you never remove the 3rd and 4th char from previous loop
for (int a = 0; a < 10; a++) {
str[a] = 0;
}
}
c1++;
result[j++] = ' ';
}
return (result);
}
int main()
{
printf("%sn", decode_morse(".... . -.-- .--- ..- -.. ."));
}
i的值增加到55,并且您试图索引超出界限。在没有保护措施的情况下使用while循环是非常危险的,可以考虑将其转换为for循环。
grandia的回答很好,我同意他的推理。str
已损坏,并且它与数组morse
中的任何字符串都不匹配。这就是while循环越界的原因。
不过,我有一个建议,与其重置str
,不如在while循环之后立即在其当前字符集的末尾添加一个null字符("\0"(。
c2 = 0;
while (morse_code[c1] != ' ') {
str[c2] = morse_code[c1];
c1++;
c2++;
}
str[c2] = ' ';
这样可以确保忽略null字符之后的所有字符。str
不需要完全复位。
此外,请注意,当分配str
时,我们假设str
除了空字符外,最多有9个字符。我们现在就利用它。
此外,这将确保稍后出现的strcmp
始终正常工作。这包括第一次调用strcmp
,如果str
稍后才被重置,则不能保证这一点。