-3

テキストの場合: Hi\r\n how is it going \r\nareyouoay\r\n; 答えは 3 のはずですが、改行は厳密には意味がない ので、あるだけではダメです\n\r\n\n

これが私の試みです。何が間違っていますか?

FILE  *fp = fopen(fileName, "r"); 
int c, lastchar;           
int lineCount= 0;
int i;

while ( (c=fgetc(fp)) != EOF ) {
    if ( c == 'r' && lastchar == '\\' && c+1== '\\' && c+2=='n')
        lineCount++;
    lastchar = c; 
    i++;
}

そのテキストの出力は 3 になります。

4

3 に答える 3

1

一度に検索文字を実行する必要がある場合は、次のコードのようなものを使用できます

int c;           
int lineCount= 0;
int i = 0;
char next[] = {'\\', 'r', '\\', 'n' };
while ( (c=fgetc(fp)) != EOF ) {
    if (c != next[i]) {
        i = 0;
    }
    else {
        if (i == sizeof(next) - 1) {
            i = 0;
            lineCount++;
        }
        else {
            i++;
        }
    }
}

入力ファイルのサイズが制限されている場合は、代わりにstrstrを使用してから、ファイル全体をメモリに読み込む方がよいでしょう。または、より大きな入力の場合は、チャンクをメモリに読み込み、strstrチャンク境界での一致の欠落を回避する方法を使用して検討します。

于 2013-02-06T16:41:39.967 に答える
0

文字\r\nは単一の文字であるため、入力を読み取るときに、\\文字が含まれていません。さらに、Windowsを使用している場合は、ファイルをモード"rb"で開いてバイナリモードで開く必要があります。そうしないと、ランタイムによって\r文字が削除されます。

FILE  *fp = fopen(fileName, "rb");
int lastchar = 0;
int lineCount = 0;
int c;

while ((c = fgetc(fp)) != EOF) {
    if (lastchar == '\r' && c == '\n')
        lineCount++;
    lastchar = c;
}

printf("line count: %d\n", lineCount);

本当に4文字の連続を数えたい場合は、\\ r \\ nそのように行うことができます(奇妙に思えますが、入力に文字シーケンスが引用されている可能性があります)。

FILE  *fp = fopen(fileName, "rb");
char prevchars[4] = { 0, 0, 0, 0 };
char fingerprint[4] = { '\\', 'r', '\\', 'n' };
int lineCount = 0;
int c, i;

while ((c = fgetc(fp)) != EOF) {
    if (memcmp(prevchars, fingerprint, 4) == 0)
        lineCount++;
    for (i = 1; i < 4; i++)
        prevchars[i - 1] = prevchars[i];
    prevchars[3] = (char)c;
}

printf("line count: %d\n", lineCount);
于 2013-02-06T17:00:37.417 に答える
0

あなたが間違っているのは、\n複数の文字ではなく、1つの文字です。

したがって、行数を数えるには、これを行う必要があります。

while ((c = fgetc(fp))!= EOF){
   if(c == '\n') lineCount++;
}

printf("No. of lines = %d", lineCount);
于 2013-02-06T16:42:56.467 に答える