1

私はchar*strをループしようとしていますが、これを使用して行数を調べます。

char *str = "test1\ntest2\ntest3";

int lines = 0;

for(int i = 0 ; i < ?? ; i ++ )
{
    if(str[i] == '\n') {
        lines++;
    }
}

??に何を入れるべきかわからない、質問は:

1.strlen(str)+ 1を使用する必要があるということですか?

2.strが"test1\ ntest2 \ ntest3 \ n"の場合でも、コードは正しい行を計算しますか?

ちなみにgccを使っていますありがとう

4

6 に答える 6

7

すべてのリテラル文字列\0はヌル文字で終わります。これは文字列の終わりを表します。

だから、あなたはこれを行うことができます

for(int i = 0 ; str[i]!='\0' ; i ++ )
于 2012-11-11T13:18:27.443 に答える
3

既存の良い答えを拡張するには:C文字列をループする慣用的な方法は次のとおりです。

const char *s = "abc\ndef\nghi\n";
int lines = 0;
int nonempty = 0;
while (*s) {
    nonempty = 1;
    if (*s++ == '\n') lines++;
}

最後の空の行を別の行としてカウントしたくない場合は、次のように追加します。

if (nonempty && s[-1] == '\n' && lines > 0) lines--;

whileループの後。

于 2012-11-11T13:25:56.440 に答える
1

以下は、最後の文字が改行であるかどうかに関係なく、同じ結果を提供します。

char *abc = "test1\ntest2\ntest3";

int lines = 0;

{
    bool lastWasNewline = true;
    char * p = abc;
    for (; *p; ++p) {
        if (lastWasNewline) ++lines;
        lastWasNewline = *p == '\n';
    }
}
于 2012-11-11T13:23:40.580 に答える
1

文字列の長さを取得し、すべての文字を繰り返し処理します。

const unsigned long length=strlen(str);
for(int i = 0 ; i < length ; i ++ )
{
     if(str[i] == '\n') {
       lines++;
   }
}
于 2012-11-11T13:19:17.717 に答える
0

??置く代わりにstrlen(abc)確認してください#include <string.h>

より良い効率のために

int length= strlen(abc);

その後、i < length

または使用するstr[i]!= '\0'

于 2012-11-11T13:17:19.413 に答える
0

1.strlen(str)+ 1を使用する必要があるということですか?

いいえ、使用するだけstr[i]です。これは、それが文字列を終了する文字であるi < ??かどうかをテストします0

2.abcが"test1\ ntest2 \ ntest3 \ n"の場合でも、コードは正しい行を計算しますか?

いいえ、コードは、入力がバッファーごとに1つの入力行に分割されることを前提としていますline[j]

于 2012-11-11T13:19:23.133 に答える