0

私はこの本の演習 1-9 (入力を出力にコピーするプログラムを作成し、1 つまたは複数の空白の各文字列を単一の空白に置き換える) を行っていましたが、よくわかっていないようです。これまでのところ、これは私のコードです:

#include <stdio.h>

int main() {
    int c;

    while ((c = getchar()) != EOF)
        if (c == ' ') {
            while (c == ' ') {
                c = getchar();
            }
            putchar(' ');
        } else {
            putchar(c);
        }

    return 0;
}

という文hey(blank)(blank)(blank)nowになるので間違っていhey owます。最後の空白の後の最初の文字は常に消去されます。かなりばかげたバグだと思いますが、修正方法がわかりません。アドバイスをいただければ幸いです。PS: 私の英語で申し訳ありません。何かわからないことがあれば教えてください。

4

3 に答える 3

2

このifステートメントで(私はそれが読めるようにフォーマットしました)

if (c == ' ')
{
    while (c == ' ')
    {
        c = getchar();
    }
    putchar(' ');
}

外側のループにあるため、読み取られたばかりの非空白文字をスキップしています

while ((c = getchar()) != EOF)

あなたは次の文字を読んでいます。

プログラムは、たとえば次のように記述できます。

#include <stdio.h>

int main( void )
{
    int blank = 0;
    int c;

    while ( ( c = getchar() ) != EOF )
    {
        if ( !blank || c != ' '  ) putchar( c );
        blank = c == ' ';
    }

    return 0;
}

C標準に従って、mainパラメーターなしで次のように宣言する必要があることを考慮してください

int main( void )
于 2016-01-19T22:41:28.747 に答える