循环多行代码的好方法是什么?

我的函数foo(char *str)接收str ,它是一个多行字符串,并带有空行终止的新行字符。 我正在尝试编写一个循环遍历字符串并在一行上运行。 什么是实现这一目标的好方法?

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

我是否需要自己实现getLine还是需要一个内置函数来为我执行此操作?


您将需要基于自己的新行字符来实现某种解析。 带有“ 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()既是破坏性的,也不是线程安全的。


我想你可能会使用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' ),因此如果您需要进一步操作,可能需要事先制作它的副本。


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

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

链接地址: http://www.djcxy.com/p/56639.html

上一篇: What is a good way of looping through lines in a multi

下一篇: how to keep gtk.window always on top level