将给定字符串转换为 2D 数组时,每次我尝试返回时,数组的第一个元素都会更改为随机字符串。
这是代码。我已经GDB并尝试使用无键字符串,但仍然失败。 count_letters
和count_words
只是遍历给定的指针,直到找到一个键或分别计算所有键。
char **str_to_dp(char const *str, char const key)
{
char **arr = malloc(sizeof(*arr) * (count_words(str, key) + 1));
int i = 0;
if (!arr)
perror("get_PATH");
for (int j = 0, word = 0; str[j]; j++, i++, word = 0) {
while (str[j] == key)
j++;
arr[i] = malloc(count_letters(str + j, key) * sizeof(char));
if (!arr[i])
perror("get_PATH");
while (str[j] != key)
arr[i][word++] = str[j++];
}
arr[i] = 0;
return arr;
}
当在循环内打印arr[i]
并且 GDB 仍在循环内时,第一个元素保持正常。 每当我尝试打印(例如,在返回之前有一个循环)时,我都会得到第一行的随机值(有时是第二行,如果字符串有足够的元素)。知道为什么吗?
感谢您通读。
尝试在 gdb 中单步执行。 基本问题是,每当你到达for循环的底部时,str[j] == key
都是真的。 除非' '
key,否则测试str[j]
将始终成功,并且您的 for 循环将离开数组的末尾。
您需要计算 for 循环中的单词,而不是运行到str[j] == 0
,或者更改 for 循环末尾的while
循环以将while (str[j] != key && str[j])
作为其测试。
除了@dgnuff所说的之外,似乎我的问题不在函数之外。我已将(char **)
数组转换为(char const *)
而不是(char const **)
。