【发布时间】:2013-06-12 08:53:28
【问题描述】:
我正在尝试用 C 编写一个函数,它接受一个指向以'\0' 结尾的连续字符的指针——即一个字符串——和一个单一的常量字符分隔符,然后输出一个指向连续指针的指针,每个指针它指向一个新字符串。这些新字符串对应于在每个分隔符处中断并正确终止的输入字符串。简而言之,我想动态构建一个字符串数组。
为此,我计划使用 malloc() 来分配我需要的内存。 “父数组”将是sizeof(char *) * (count + 2) 字节长,以容纳指向每个分隔子字符串的第一个字符的指针,以及一个终止符。同样,每个“子数组”的长度为 sizeof(char) * (j + 1) 字节,以容纳每个子字符串的所有字符,再加上一个终止符。
到目前为止我的代码是这样的。
#include <stdio.h>
#include <stdlib.h>
char *split(char *string, const char delimiter);
int main(int argc, char *argv[]) {
char *x = split(argv[1], '.');
while (*x) {
printf("%d\n", *x);
}
return 0;
}
char *split(char *string, const char delimiter) {
int length, count, i, j = 0;
while(*(string++)) {
if (*string == delimiter) count++;
length++;
}
string -= length;
char *array = (char *)malloc(sizeof(char *) * (length + 1));
for(i, j = 0; i < (count + 1); i++) {
while(*(string++) != delimiter) j++;
string -= j;
*array = (char *)malloc(sizeof(char) * (j + 1));
while(*(string++) != delimiter) *(*array++) = *(string++);
**array = '\0';
string++;
array += sizeof(char *);
}
*array = '\0';
array -= (sizeof(char *) * (length + 1));
return array;
}
我的问题是为什么编译器会吐出以下错误?
split2.c: In function ‘split’:
split2.c:25: warning: assignment makes integer from pointer without a cast
split2.c:26: error: invalid type argument of ‘unary *’ (have ‘int’)
split2.c:27: error: invalid type argument of ‘unary *’ (have ‘int’)
我的猜测是,当分配“父数组”的内存时,编译器期望int 值,而不是char * 将存储在那里。如果是这种情况,我该如何正确更正我的代码?
我知道使用string.h 有更简单的方法来做这种事情;我编写这段代码的动机是为了更好地了解指针在 C 中的工作原理。
提前非常感谢!
【问题讨论】:
-
你为什么要双重取消引用
array? -
为什么不使用
strtok? -
length 和 count 在首次使用前都未初始化。
-
@wildplasser:
i也是如此 :) -
我在看到前两个错误后停止阅读。它们已经够多了。