C语言中的双重分割

7

好的。例如,我有一个txt文件,其中包含以下行:

1|1,12;7,19;6,4;8,19;2,2
可以看出,它由两部分组成,由|分隔。我没有问题获取这两个部分,并使用;分隔符分离第二部分 1,12;7,19;6,4;8,19;2,2。但是我在分隔每组数据的第一和第二个数字时遇到了问题,需要使用,分隔符。

这是我的当前代码:

  result = strtok(result, ";");

  while(result != NULL ) {
      printf("%s\n", result);
      result = strtok(NULL, ";");
  }

它输出了以下结果:

1,12
7,19
6,4
8,19
2,2

好的,很棒。但是当我尝试使用'strtok'(我正在使用这种方法进行拆分)时,像这样:

 result = strtok(result, ";");

 while(result != NULL ) {
     //printf("%s\n", result);
     help    = strtok(result, ",");    
     while(help != NULL) {
         printf("<%s>", help);
         help = strtok(NULL, ",");
     }

     result  = strtok(NULL, ";");
 }

我只得到了 "<1>,<12>",就像这组数字中只有一个集合。我不明白其他数字在哪里。相反,输出应为:<1>,<12>,<7>,<19>,<6>,<4>,<8>,<19>,<2>,<2>。有人可以提供一个解决方案吗,如何获得这组数字中每个集合的每个数字。也许有其他方法或者我做错了什么 :) 谢谢!
5个回答

6
除了Neil提到的修改原始字符串之外,strtok()函数不能像您描述的嵌套使用。您可能需要调查strtok_r()函数或完全避免使用strtok*系列函数。

3

char *strtok(char *str, const char *delim); (来自man页面)
参数delim指定用于分隔解析字符串中标记的一组字符。调用者可以在连续调用中使用不同的字符串delim来解析相同的字符串。

因此,使用;,作为分隔符以获取所有数字。

//this will delimit result whenever ";" or "," is found
result = strtok(result, ";,"); 

while(result != NULL ) {
    printf("%s\n", result);
    result = strtok(NULL, ";,");
}

2
正如其他人指出的那样,strtok()不是可重入的 - 它会维护有关正在解析的字符串的内部状态,因此不能同时用于解析两个不同的字符串(这意味着它的第一个参数有两个不同的非NULL值,因此您的情况也包括在内)。
如果您有可重入版本strtok_r(),则可以更改您的代码以使用它,如下所示:
char *st_result, *st_help;
result = strtok_r(result, ";", &st_result);

while (result) {
     printf("[%s]", result);
     help = strtok_r(result, ",", &st_help);    
     while (help) {
         printf("<%s>", help);
         help = strtok_r(NULL, ",", &st_help);
     }

     result = strtok_r(NULL, ";", &st_result);
}

1

第一个strtok将原始字符串分割成多个以null结尾的字符串。第二个strtok仅应用于这些字符串中的第一个 - 它在第一个strtok调用创建的第一个null终止符处停止。您需要为第一个strtok创建的每个字符串调用第二个strtok代码。


1

C语言中的 strtok 函数比较恶心,因为它会修改源字符串,在分隔符的位置插入NULL。因此,第二个循环在到达外部循环插入的NULL之后就停止了。你需要将指向以分号;分隔的字符串的指针保存到其他地方,然后分别对每个指针使用strtok

或者,如果你确实想要使用嵌套循环,请参见这里


哇,谢谢大家!非常好用!从未想过它如此简单。 - Dmitri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接