2011-12-01 48 views
7

我的功能foo(char *str)收到str这是一个多行字符串,其中包含以空终止的新行字符。我正在尝试编写一个循环遍历字符串并在一行上运行。什么是实现这一目标的好方法?什么是循环多行字符串中行的好方法?

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

我需要实现我自己getLine还是有一个内置功能,为我做到这一点?

+1

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

回答

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

我想你可能会使用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内容(它实际上用'\0' s取代'\n' s),所以如果您需要更进一步,您可能需要事先制作它的副本。

0

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

+0

他想从字符串而不是文件读取行。我不确定C是否有串流。 –

+0

@ChristianRau C没有'stringstream's,但它确实有'fgets',它不使用它们。但是,你说的正确的是OP想要一个字符串而不是一个文件。 – Kevin

+0

@Kevin我只是认为可能有一种方法可以为字符串创建文件描述符,这将是字符串流的C路。 –

1

的sooo ...有点晚了,但下面是@ debeer的和@Christian劳的回答可重入版本 - 注意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); 
} 

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

相关问题