我的功能foo(char *str)
收到str
这是一个多行字符串,其中包含以空终止的新行字符。我正在尝试编写一个循环遍历字符串并在一行上运行。什么是实现这一目标的好方法?什么是循环多行字符串中行的好方法?
void foo(char *str) {
while((line=getLine(str)) != NULL) {
// Process a line
}
}
我需要实现我自己getLine
还是有一个内置功能,为我做到这一点?
我的功能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
内容(它实际上用'\0'
s取代'\n'
s),所以如果您需要更进一步,您可能需要事先制作它的副本。
您可以使用fgets
做getLine
工作:http://linux.die.net/man/3/fgets
他想从字符串而不是文件读取行。我不确定C是否有串流。 –
@ChristianRau C没有'stringstream's,但它确实有'fgets',它不使用它们。但是,你说的正确的是OP想要一个字符串而不是一个文件。 – Kevin
@Kevin我只是认为可能有一种方法可以为字符串创建文件描述符,这将是字符串流的C路。 –
的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);
}
请注意,它仍然具有破坏性,因为它修改了被标记化的字符串。
有一个内置的getline,但它不是你想要的。它用于从文件中一次获取一行。 – Kevin