【问题标题】:Parsing a string解析字符串
【发布时间】:2010-04-22 23:00:34
【问题描述】:

我有一个格式为“ABCDEFG,12:34:56:78:90:11”的字符串。我想将这两个用逗号分隔的值分隔成两个不同的字符串。我如何使用 c 语言在 gcc 中做到这一点。

【问题讨论】:

  • 不清楚你需要什么样的语法检查。你只是想做CSV吗?第一个字符必须是大写的吗?

标签: c string parsing


【解决方案1】:

一种可能性是这样的:

char first[20], second[20];

scanf("%19[^,], %19[^\n]", first, second);

【讨论】:

  • 该死!我想投票,但无线鼠标出事了,不能再对这个答案投票了!请将此评论视为 +1 :)
【解决方案2】:

这么多人建议strtok...为什么? strtok 是石器时代编程的遗留物,仅适用于 20 行实用程序!

对 strtok 的每次调用都会通过在该调用返回的标记后插入一个空字符来修改 strToken。 [...] [F]unction 使用静态变量将字符串解析为标记。 [...] 对该函数的交错调用极有可能产生数据损坏和不准确的结果。

scanf,就像 Jerry Coffin 的 answer 一样,是一个更好的选择。或者,您可以手动完成:找到带有strchr 的分隔符,然后将部分复制到单独的缓冲区中。

【讨论】:

    【解决方案3】:
    char str[] = "ABCDEFG,12:34:56:78:90:11"; //[1]
    
    char *first = strtok(str, ",");  //[2]
    char *second = strtok(NULL, "");  //[3]
    

    [1] ABCDEFG,12:34:56:78:90:11
    
    [2] ABCDEFG\012:34:56:78:90:11
         逗号替换为空字符,第一个指向“A”
    
    [3] 对 `strtok` 的后续调用将 NULL` 作为第一个参数。
         您可以更改分隔符。
    
    注意:你不能使用“字符串文字”,因为 `strtok` 修改了字符串。
    

    【讨论】:

    • 我在尝试这个时遇到分段错误?可能是什么原因?
    • @sfactor -- 您可能正在调用strtok("ABCD,etc.", ",") -- 即将字符串文字传递给strtokstrtok 通过修改原始字符串来工作——它将分隔符 (',') 替换为空字符。这是我什至不向我的敌人推荐strtok 的原因之一:)。 (第二个原因是它保持全局状态,因此不能重入,也不能是线程安全的)。
    • @sfactor:除了 atzz 已经说过的,确保你调用 strtok 的字符串是空终止的。你能准确地发布你使用的是什么吗?
    • @atzz:是的,但是 OP 不需要线程安全代码(你是 OP 吗?)并且 IMO OP 提到“我想将用逗号分隔的这两个值分隔成两个不同的字符串” ,所以strtok 对我来说似乎是个不错的选择。
    • 您的第二行实际上可以是char *second = strtok(NULL, ""); 以获取字符串的其余部分。
    【解决方案4】:

    您可以使用strtok,它允许您指定分隔符并为您生成令牌。

    【讨论】:

      【解决方案5】:

      你可以使用 strtok

      来自cppreference.com的示例:

       char str[] = "now # is the time for all # good men to come to the # aid of their country";
       char delims[] = "#";
       char *result = NULL;
       result = strtok( str, delims );
       while( result != NULL ) {
           printf( "result is \"%s\"\n", result );
           result = strtok( NULL, delims );
       }
      

      【讨论】:

        【解决方案6】:

        尝试使用以下正则表达式,它会找到任何带有字符 a-z A-Z 后跟“,”的内容

        "[A-Z]," 如果您也需要小写字母,请尝试 "[a-zA-Z],"

        如果您需要它先搜索第二部分,您可以尝试以下方法

        ",[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}: [0-9]{2}"

        有一个关于如何使用正则表达式的例子 http://ddj.com/184404797

        谢谢, V$h3r

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-01
          • 2010-11-07
          • 2015-01-13
          • 2013-04-07
          • 2019-03-11
          • 2011-11-27
          • 2021-03-02
          相关资源
          最近更新 更多