将逗号之间的字符串分隔为c

时间:2015-07-02 00:38:14

标签: c

我想将一个字符串拆分成存储在数组(字符串)中的几个字符串。我尝试使用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,",");
}

2 个答案:

答案 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);