2011-12-01 14 views
7

私の関数foo(char *str)は、ヌル終端の改行文字を含む複数行の文字列であるstrを受け取ります。私は文字列を繰り返し、1行で動作するwhileループを作成しようとしています。これを達成する良い方法は何ですか?複数行の文字列の行をループするにはどうすればよいですか?

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(それの内容を変化させることを念頭に置いておきます実際に '\n''\0'秒で置き換えています。そのため、必要な場合は事前にコピーを作成することをおすすめします。

0

あなたはgetLine仕事をするためにfgetsを使用することができます。

+0

彼はファイルではなく文字列から行を読みたい。 Cに文字列ストリームがあるかどうかはわかりません。 –

+0

@ChristianRau Cは 'stringstream'を持っていませんが、' string'を使っていない 'fgets'を持っています。しかし、あなたはOPがファイルではなく文字列からの行を必要としていることは間違いありません。 – Kevin

+0

@Kevin私は文字列のファイル記述子を作成する方法があると思っていました。これは文字列ストリームのC-ウェイです。 –

1

http://linux.die.net/man/3/fgetsすっごく...少し遅れますが、以下の@ 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); 
} 

それはトークン化された文字列を変更すると、それはまだ破壊的であることに注意してください。

関連する問題