【问题标题】:What is a good way of looping through lines in a multi-line string?在多行字符串中循环行的好方法是什么?
【发布时间】:2011-12-01 23:42:07
【问题描述】:

我的函数foo(char *str) 接收str,这是一个多行字符串,其中包含以空值结尾的换行符。我正在尝试编写一个遍历字符串并在一行上运行的 while 循环。实现这一目标的好方法是什么?

void foo(char *str) {
    while((line=getLine(str)) != NULL) {
        // Process a line
    }
}

我需要自己实现getLine,还是有内置函数可以帮我实现?

【问题讨论】:

  • 有一个内置的getline,但这不是你想要的。它用于从文件中一次获取一行。

标签: c string parsing


【解决方案1】:

您需要自己根据换行符实现某种解析。带有分隔符“\n”的 strtok() 是一个很好的选择,它可以执行您正在寻找的事情,但它的使用方式必须与您的示例略有不同。它更像是:

char *tok;
char *delims = "\n";
tok = strtok(str, delims);

while (tok != NULL) {
  // process the line

  //advance the token
  tok = strtok(NULL, delims);
}

但是,您应该注意,strtok() 既具有破坏性,也不是线程安全的。

【讨论】:

    【解决方案2】:

    我认为您可能会使用strtok,它将字符串标记为由某些特定字符分隔的数据包,在您的情况下是换行符:

    void foo(char *str)
    {
        char *line = strtok(str, "\n");
        while(line)
        {
            //work with line, which contains a single line without the trailing '\n'
            ...
    
            //next line
            line = strtok(NULL, "\n");
        }
    }
    

    但请记住,这会改变 str 的内容(它实际上将 '\n's 替换为 '\0's),因此如果您进一步需要它,您可能需要事先制作一份副本。

    【讨论】:

      【解决方案3】:

      Sooo...有点晚了,但下面是@debeer 和@Christian Rau 的答案的可重入版本-注意strtok_r 而不是strtok。 这可以使用不同的字符串从多个线程调用。

      char *tok;
      char *saveptr;
      char *delims = "\n";
      tok = strtok_r(str, delims, &saveptr);
      
      while (tok != NULL) {
        // process the line
      
        //advance the token
        tok = strtok_r(NULL, delims, &saveptr);
      }
      

      请注意,它仍然具有破坏性,因为它会修改被标记化的字符串。

      【讨论】:

        【解决方案4】:

        您可以使用fgets 来完成getLine 的工作:http://linux.die.net/man/3/fgets

        【讨论】:

        • 他想从字符串而不是文件中读取行。我不确定 C 是否有字符串流。
        • @ChristianRau C 没有stringstreams,但它有fgets,它不使用它们。但是,你是对的,OP 想要字符串中的行,而不是文件。
        • @Kevin 我只是认为可能有一种方法可以为字符串创建文件描述符,这将是字符串流的 C 方式。
        猜你喜欢
        • 2010-10-18
        • 2015-06-11
        • 2014-04-12
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        相关资源
        最近更新 更多