7

好的。例如,我的 txt 文件中有这一行:

1|1,12;7,19;6,4;8,19;2,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>。有人可以给出一个解决方案,如何获得每组这组数字的每个数字。也许还有其他方法或者我做错了什么:)

谢谢!

4

5 回答 5

6

除了 Neil 指出的关于修改原始字符串的内容之外,该strtok()函数并非旨在以您所描述的嵌套方式使用。您可能希望调查该strtok_r()功能,或完全避免使用strtok*家庭。

于 2010-04-10T09:45:01.587 回答
3

char *strtok(c​​har *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, ";,");
}
于 2010-04-10T09:43:42.067 回答
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);
}
于 2010-04-10T12:12:21.553 回答
1

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

于 2010-04-10T09:43:52.147 回答
1

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

或者,如果您确实想使用嵌套循环,请参见此处

于 2010-04-10T09:48:15.797 回答