4

テキストファイルがファイル内にあると仮定するとhello\n stack overflow \n、出力2は2つ\nのシーケンスがあるためです。代わりに、私は答えとして1つを得ています。私は何を間違っていますか?これが私のコードです:

int main()
{
    FILE                *fp = fopen("sample.txt", "r");    /* or use fopen to open a file */
    int                 c;              /* Nb. int (not char) for the EOF */
    unsigned long       newline_count = 1;

        /* count the newline characters */
    while ( (c=fgetc(fp)) != EOF ) {
        if ( c == '\n' )
            newline_count++;
        putchar(c);
    }

    printf("\n  %lu newline characters\n ", newline_count);
    return 0;
}
4

1 に答える 1

3

これを試して:

int main()
{
    FILE                *fp = fopen("sample.txt", "r");    /* or use fopen to open a file */
    int                 c, lastchar = 0;              /* Nb. int (not char) for the EOF */
    unsigned long       newline_count = 0;

        /* count the newline characters */
    while ( (c=fgetc(fp)) != EOF ) {
        if ( c == 'n' && lastchar == '\\' )
            newline_count++;
        lastchar = c; /* save the current char, to compare to next round */
        putchar(c);
    }

    printf("\n  %lu newline characters\n ", newline_count);
    return 0;
}

実際、リテラル\nは 1 文字ではなく 2 文字 (文字列) です。そのため、単純にキャラクターとして比較することはできません。

編集はと の\n2 文字であるため 、最後に読み取った文字を記憶し、現在の文字がで、前の文字が であるかどうかを確認する必要があります。両方のテストが true の場合、ファイル内でシーケンスが見つかったことを意味します。\nn\\n

于 2013-02-06T03:26:38.833 に答える