【问题标题】:How to split string by commas optionally followed by spaces without regex?如何用逗号分割字符串,可选地后跟没有正则表达式的空格?
【发布时间】:2013-09-09 10:54:33
【问题描述】:

我需要这个简单的拆分

Item one, Item2,  Item no. 3,Item 4
>
Item one
Item2
Item no.3
Item 4
  • 我知道我可以在scanf 中使用%*[, ] 格式来忽略逗号和空格,但这并不准确:分隔符应该正好是一个逗号,后跟空格。
  • 我想我也不能使用strtok,因为单独的空格不是分隔符。

我真的需要正则表达式吗,或者有什么有效的短方法来编码吗?

【问题讨论】:

  • 使用strtok 查找下一个逗号,然后向前扫描直到找到非空格字符?
  • 好主意,可能是一个答案
  • 或者,您可以编写一个非常简单的 for 循环来执行此操作。花费您 5 分钟的时间,它比任何图书馆调用都更有效率。

标签: c parsing


【解决方案1】:

怎么样:

char inputStr[] = "Item one, Item2,  Item no. 3,Item 4";
char* buffer;

buffer = strtok (inputStr, ",");

while (buffer) {
    printf ("%s\n", buffer);          // process token
    buffer = strtok (NULL, ",");
    while (buffer && *buffer == '\040')
        buffer++;
}

输出:

Item one
Item2
Item no. 3
Item 4

【讨论】:

  • 我建议使用strtok_r 而不是strtok 以避免在多线程环境中出现有趣的错误。
  • strtok_r 不是标准 C,是吗?例如,我不知道它是否会在 Windows 机器上编译。见stackoverflow.com/questions/9021502/…
  • while (buffer && *buffer == '\040') 行有什么作用?
  • while (buffer) 检查缓冲区中的字符不是 NUL,即我们不在字符串的末尾。 (*buffer == '\040') 检查缓冲区中的字符是否为空格。因此,只要我们不在字符串的末尾,并且当前字符是空格,我们就会移动到下一个字符。
【解决方案2】:

您可以逐步查找字符串,或 0x00 并将 any 替换为 0x00,然后跳过任何空格以查找下一个字符串的开头。正则表达式要容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多