我的函数foo(char *str)
收到str
这是一个多行字符串,其中包含以null结尾的换行符。我正在尝试编写一个while循环,它遍历字符串并在一行上运行。实现这一目标的好方法是什么?
void foo(char *str) {
while((line=getLine(str)) != NULL) {
// Process a line
}
}
我是否需要自己实施getLine
或者是否有内置函数为我执行此操作?
答案 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