循环多行字符串中的行的好方法是什么?

时间:2011-12-01 23:42:08

标签: c string parsing

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

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

我是否需要自己实施getLine或者是否有内置函数为我执行此操作?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我认为您可以使用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'替换为'\0' s),因此您可能需要事先复制它。你还需要它。

答案 2 :(得分:1)

Sooo ......有点晚了,但下面是@ debeer&和@Christian Rau的答案的重入版本 - 请注意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); } 。 这可以使用不同的字符串从多个线程调用。

public static void main(String [] args)
{
    ...
    Stage myStage = new Stage();
    Player myPlayer = new Player(myStage);

    myStage.addActor(myPlayer);
    ...
}

...

public class Player extends Actor
{

    Stage myStage;        

    public Player(Stage _stage)
    {
        myStage = _stage;

        myStage.addActor(<another Actor object>);
    }
}

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

答案 3 :(得分:0)

您可以使用fgets执行getLine工作:http://linux.die.net/man/3/fgets