编译器消息是我们的朋友。我简单地用它们来追踪你的问题。 尝试以下操作,并将所做的与您所做的进行比较。特别注意指针变量的声明和使用... :)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char **toArray(char **array, char str[], char sep[], int *count);
int main(int argc, char* argv[]) {
char test[] = "Hello there lol";
int count = 0;
char **array = malloc((sizeof(char*) * 5) +1); //added "+ 1" here, read why
toArray(array, test, " ", &count); //in comment below
printf("Count: %d\n", count);
int array_i;
for (array_i = 0; array_i < count; array_i++) {
printf("array %d: %s\n", array_i, array[array_i]);
//free(array[array_i]);
}
getchar();
free(array);
return 1;
}
char **toArray(char **array, char str[], char sep[], int *count) {
char *temp = str;
temp = strtok(temp, sep);
array[0] = temp;
*count = 1;
while ((temp = strtok(NULL, sep)) != NULL) {
array[(*count)++] = temp;
}
return array;
}
[编辑]示例输出:
也。该行char **array = malloc(sizeof(char*) * 5);
,需要是
char **array = malloc(sizeof(char*) * 5 + 1);
因为“你好”实际上是 5 个字符加上一个 NULL 字符,'\0'
。
C 字符串的一些经验法则。
1)使用 malloc 或 calloc 时,不要忘记为'\0'
.
`char *buf1;` //buffer needed to manipulate buf2
`char buf2[]="someString";`
`buf1 = malloc(strlen(buf2)+1);` or `buf1 = malloc(sizeof(buf2));`
(note:, no '+1'. see '4)' below. )
2)在使用前清除(初始化)新分配的变量。例如:
memset(buf, 0, strlen("someString")+1); //preferred, all bytes are zeroed
或者
buf[0]=0; //useful, but use with care (only first byte is zeroed.)
3)完成后释放所有动态分配的内存。例如:
free(buf);
4)使用strlen()
函数或sizeof()
宏。(在 中都很流行[mc]alloc()
)
给定:
char *buf1 ="Hello"; //6 个字符 |H|e|l|l|o|\0|
char buf2[] ="Hello"; //6 个字符 |H|e|l|l|o|\0|
char buf3[5]="Hello"; //5 个字符 |H|e|l|l|o|
char buf4[5]="Hel"; //4 个字符 |H|e|l|\0| |
char buf5[5]="Helloo";//应该得到编译错误,太多初始化器
比较strlen() - sizeof()
结果:
strlen(buf1); //->5
(在 malloc 中需要 +1 才能使新变量 req'd 保存“Hello\0”)
sizeof(buf1); //->4
(返回 sizof (char *),而不是字符串中的 # 字符)
strlen(buf2); //->5
(需要在 malloc 中 +1 才能获得新变量 req'd yo hold "Hello\0")
sizeof(buf2); //->6
(计算所有字符,包括 '\0')
strlen(buf3); //->
(错误:字符串参数中缺少终止 NULL)
sizeof(buf3); //->5
(计算所有字符,但此字符串中没有 '\0' - 错误!)
strlen(buf4); //->3
(计算字符,但不包括 '\0')
sizeof(buf4); //->5
(计算所有分配的空间,包括 '\0')