【发布时间】:2016-09-19 11:01:34
【问题描述】:
我正在尝试编写一个拆分程序,该拆分程序接收一个包含多个单词的字符数组,并将每个单词分成它们自己的较小的字符数组。较小的字符数组的所有指针都保存在一个指针数组中,因此我可以返回一个双指针。
你能看看我的代码,看看你是否发现任何错误。当我尝试运行我的程序时,我的计算机逐渐变慢,3-4 秒后我无法移动鼠标或 alt+f4 我的编辑器。所以肯定有严重的问题!
而且我对 C 编程完全陌生,所以我肯定会犯一个愚蠢的错误。
char **split(char *s) {
char **result;
int wrd_cnt = 2; //I'm adding NULL at the end of the pointer-array.
//Counts the number of words to allocate memory for the pointer-array.
for(int i = 0; i < strlen(s); i++) {
if(s[i] == ' ') {
wrd_cnt++;
}
}
result = malloc(wrd_cnt * sizeof(char*));
//Counts letters in each word to allocate memory for every single small char-array with malloc.
for(int i = 0; i < strlen(s); i++) {
for(int j = 0; j < (wrd_cnt); j++) {
int char_cnt = 0;
for(int k = 0; s[i] != ' ' || s[i] != '\0'; k++, i++) {
char_cnt++;
result[j] = malloc(char_cnt * sizeof(char));
}
}
}
//Puts each word into their own place in the pointer array.
for(int i = 0; i < strlen(s); i++) {
for(int j = 0; j < (wrd_cnt); j++) {
for(int k = 0; s[i] != ' ' || s[i] != '\0'; k++, i++) {
result[j][k] = s[i];
}
}
}
result[wrd_cnt-1] = NULL;
return result;
}
【问题讨论】:
-
s[i] != ' ' || s[i] != '\0'应该是s[i] != ' ' && s[i] != '\0',否则会超出字符串范围。 -
应该考虑\t和\v
-
@AndreaBiondo 这不是意味着条件是 s[i] 既是 ' ' 又是 '\0' 来满足条件?这不可能?
-
@Magnarok 不,
&&你是说“如果字符不是空格 并且 不是 NUL 则循环”,而使用||你是说“如果字符不是空格或不是NUL,则循环”。s[i] != ' ' || s[i] != '\0'将始终为真,因为s[i] != ' '或s[i] != '\0'之一将始终为真。所以你有一个无限循环。 -
正如@user3121023 所说,
result[j] = malloc(...)应该在j循环中,而不是在k循环中。
标签: c arrays pointers split double-pointer