在C中双重拆分

时间:2010-04-10 09:39:13

标签: c string split strtok

行。例如,我在我的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, ";");
 }

我只得到“&lt; 1&gt;,&lt; 12&gt;”比如这组数字中只有一组。我不明白其他数字在哪里。相反,输出应为:1,&lt; 12&gt;,&lt; 7&gt;,&lt; 19&gt;,&lt; 6&gt;,&lt; 4&gt;,&lt; 8&gt;,&lt; 8&gt;,&lt; 2&gt;,&lt; 2&gt; ,&LT; 2。有人可以给出一个解决方案,如何获得每组的EACH号码这组数字。也许还有其他方法或者我做错了什么:)

谢谢!

5 个答案:

答案 0 :(得分:6)

除了Neil指出的有关修改原始字符串的内容之外,strtok()函数并非设计为以您描述的嵌套方式使用。您可能希望调查strtok_r()函数,或完全避免使用strtok*系列。

答案 1 :(得分:3)

  

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

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

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

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

答案 2 :(得分:1)

第一个strtok将原始文件拆分为多个空终止字符串。第二个strtok仅应用于这些字符串中的第一个 - 它在第一个strtok调用创建的第一个空终止符处停止。您需要为第一个创建的字符串调用第二个strtok代码。

答案 3 :(得分:1)

正如其他人所指出的那样,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);
}

答案 4 :(得分:0)

C strtok非常邪恶,它修改了源字符串,插入NULL代替分隔符。因此,当第二个循环到达外部循环插入的NULL时,它会停止。您想要的是将指针保存到; - 其他地方的分隔字符串,然后分别保存strtok每个字符串。

或者,如果您确实想使用嵌套循环,see here