我想将一个字符串拆分成存储在数组(字符串)中的几个字符串。我尝试使用strtok_r
,但我无法使用它。所以我尝试使用这段代码:
int r=0;
int c=0;
for (int e=0;buf2[e]!=NULL;e++) {
if (buf2[e]!=",") {
monsters[i].types[c][r] = buf2[e];
r++;
} else {
r=0;
c++;
}
}
buf2
是我分裂的字符串,monsters[i].types[c]
是我将其拆分成的字符串数组。当我这样做时,它给了我:
In file included from main.c:7:0:
resource.h: In function ‘main’:
resource.h:97:22: warning: comparison between pointer and integer [enabled by default]
for (int e=0;buf2[e]!=NULL;e++) {
^
resource.h:98:14: warning: comparison between pointer and integer [enabled by default]
if (buf2[e]!=",") {
^
我尝试使用ascii值代替NULL
& ","
,它并没有给我任何警告,但它没有起作用。有没有办法在for
之前将两个额外的变量声明包含在for循环中,旁边是另一个int声明?
修改
所以我尝试使用strtok
,这是我的代码:
buf3 = strtok(buf2,",");
strcpy(monsters[i].types[0],buf3);
for (int e=1;buf3!=NULL;e++) {
buf3 = strtok(NULL,",");
strcpy(monsters[i].types[e],buf3);
}
这给了我一个Segmentation fault (core dumped)
重新编辑:
好的,所以我只需要切换设置buf3
&的顺序。 strcpy
:
buf3 = strtok(buf2,",");
for (int e=0;buf3!=NULL;e++) {
strcpy(monsters[i].types[e],buf3);
buf3 = strtok(NULL,",");
}
答案 0 :(得分:2)
首先,C语言中的字符常量语法使用单引号:','
,而不是","
。
其次,不要将字符值与NULL
进行比较。 NULL
保留给指针上下文。终止零字符可以描述为'\0'
或简称为0
。
第三,有专门的库函数专门用于简化此任务,如strtok
。我不知道你是否可以使用它们。
至于变量声明,是的,你可以将它们全部放在for
中,只要它们都具有相同的类型
for (int e = 0, r = 0, c = 0; ...
请注意,在for
之后,以这种方式声明的变量将不可用。在此c
后,您肯定需要for
。
答案 1 :(得分:0)
char kDelimiter = ',';
char* start = my_string;
char* end = my_string;
char *substrings[SUBSTRINGS_MAX_NUM];
uint32_t substring_idx = 0;
uint32_t finished = 0; /* false */
do {
end = strchr(start, kDelimiter);
if (!end) {
end = my_string + strlen(my_string);
finished = 1; /* true */
}
ssize_t substring_len = end - start;
substrings[substring_idx] = NULL;
substrings[substring_idx] = malloc(substring_len + 1);
if (!substrings[substring_idx]) {
fprintf(stderr, "Error: Could not allocate space for substring!\n");
exit(EXIT_FAILURE);
}
memcpy(substrings[substring_idx], start, end - start);
substrings[substring_idx] + (end - start) = '\0';
start = end + 1;
substring_idx++;
} while (!finished);