将给定的字符串转换为2D数组时,每次尝试返回时,数组的第一个元素都会更改为随机字符串。
这是代码。我已经GDBed并尝试使用无键字符串,但仍然失败。 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编码时,第一个元素保持为OK。每当我尝试打印时(例如,在返回之前使用循环),我都会为第一行(如果字符串具有足够的元素,则有时为第二行)获得随机值。知道为什么吗?
感谢您通读。
答案 0 :(得分:0)
尝试在gdb中单步执行。基本的问题是,每当到达for循环str[j] == key
的底部时,它都是正确的。除非键为'\0'
,否则测试str[j]
将始终成功,并且for循环将从数组末尾移出。
您需要计算for循环中的单词数,而不是运行到str[j] == 0
为止,或者在for循环结束时更改while
循环以测试while (str[j] != key && str[j])
。
答案 1 :(得分:0)
除了@dgnuff所说的以外,似乎我的问题不在函数之外。我已经将(char **)
数组强制转换为(char const *)
而不是(char const **)
。