为什么这个C代码会出现分段错误(核心转储)



我正在尝试编写一个简单的代码来解决莫尔斯电码。但是,尽管我使用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稍后才被重置,则不能保证这一点。

相关内容

  • 没有找到相关文章

最新更新