【问题标题】:Double split in CC中的双重分裂
【发布时间】:2011-02-06 11:03:18
【问题描述】:

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

我只得到“,”,就像这组数字中只有一组一样。我不明白其余的数字在哪里。相反,输出应该是:,,,,,,,,,。有人可以给出一个解决方案,如何获得每组这组数字的每个数字。也许还有其他方法或者我做错了什么:)

谢谢!

【问题讨论】:

    标签: c string split strtok


    【解决方案1】:

    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, ";,");
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 哇。多谢你们!效果很好!没想到这么简单。
          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2012-02-18
            • 1970-01-01
            • 1970-01-01
            • 2023-03-03
            • 2016-12-12
            • 2015-11-07
            • 1970-01-01
            • 1970-01-01
            • 2010-10-25
            相关资源
            最近更新 更多