-3
char linesinfo[] = "Place\n Some\n Text\n Here";

char pch = strtok(linesinfo,"\n");

int total_line = 0;
while(pch  != NULL)
{

     pch = strtok(NULL,"\n");
     total_line++;
}

質問: total_line-1 を使用する必要がありますか、それとも単に total_line を使用する必要がありますか?

4

1 に答える 1

4

strtok()これを使用する必要はありません。解決しようとしている問題に必要のない文字列を変更し、一般的に危険で悪いです。

ループして、改行を直接数えるだけです。

int total_line = 0;
const char *str;
for(str = linesinfo; *str; ++str)
  total_line += *str == '\n';

C の比較演算子は常に false の場合は 0、true の場合は 1 を生成するため、これは機能します。これは、egifが0 以外の値を真として解釈するという事実とは異なり、信じられないほど便利な機能です

もちろん、上記はさまざまな方法で簡潔に書き直すことができます。たとえば、次のようになります。

  if( *str == '\n' )
    ++total_line;

正確な状況に応じて、これはより速い場合とそうでない場合があります。コンパイラがブランチのないコードを生成すると、元のコードの方が高速になる場合がありますが、明示的には難しいと思いifます。

于 2012-09-05T09:33:28.413 に答える