4

をいじくり回すために、Cでとてつもなく単純なプログラムを作成していgetchar()ます。プログラムは、Enterキーを押すまで入力内容を出力し、行がそれぞれ80文字以下であることを保証します。これを行うために、入力された文字数の実行カウントを保持します。文字数が70に達すると、次に検出されるスペースによって改行が発生します。70〜80の間にスペースがない場合は、改行が発生します。これは非常に単純な実装であり、左右に最適化できることを理解していますが、覚えておいてください。

while ((c = getchar()) != '\n') {
    if (lineLengthCount < 70) {
        putchar(c);
        lineLengthCount++;
    }   
    else if (lineLengthCount < 80 && (c == ' ')) {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   
    else {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   
}   

問題は、c == ' '条件付きが実際にスペースをチェックしていないように見えることです。次のような出力が得られます。

fitter happier more productive comfortable not drinking too much regula
r exercise at the gym three days a week getting on better with your ass
ociate employee contemporaries at ease eating well no microwaved dinner

ここで、スペースが検出されたときに行が切り捨てられることを期待していました。代わりに、70行目以降にどの文字を入力しても、新しい行が作成されます。私は何かが足りないのですか?' '本当に何かキャラクターを意味しますか?

4

4 に答える 4

5
while ((c = getchar()) != '\n') {
    if (lineLengthCount < 70) {
        putchar(c);
        lineLengthCount++;
    }   
    else if (lineLengthCount < 80 && (c == ' ')) {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   
    else if (lineLengthCount >= 80){
        printf("%c\n", c); 
        lineLengthCount = 0;
    }
    else{
        putchar(c);
        lineLengthCount++;
    }
}

これはうまくいくはずだと思います。これにより、80 文字未満であるが文字がスペースではない場合、else が実行されなくなります。

編集:代わりに、 lineLengthCount が 80 未満であるが、文字がスペースではない場合、まったく印刷されないことに気付いたので、最後に別のものを追加して修正しました。

これはより短く、より簡潔ではないでしょうか?

while ((c = getchar()) != '\n') {
    putchar(c);
    if((c == ' ' && lineLengthCount >= 70) || lineLengthCount >= 80){
        printf("\n");
        lineLengthCount = 0;
    }
    else
        ++lineLengthCount;
}
于 2013-03-10T19:54:05.570 に答える
4

条件に問題があります: lineLengthCountis > 70 でも次の文字がスペースでない場合、最後の文字がelseヒットし、改行してカウンターをリセットします。

于 2013-03-10T19:51:06.287 に答える
1

' ' の使用は完全に有効です。C 標準ライブラリ関数 isspace() を使用して、文字がスペースかどうかを確認することもできます。この関数は、次のようにブール式を返します。

char ch = '0';

if (isspace(ch))
    //the char is a space...

「スペース」とは、この関数が実際に「空白」文字であることを意味するため、「\n」または空のスペースとして出力されるその他の文字が含まれます。

10 進値 32 を使用することもできます。これは、スペースと同じことを意味します。

if (ch==32)

ただし、読みやすくするために、最初のバージョンを使用したいと思います!

于 2013-03-10T19:58:30.147 に答える
1

何が起こっているのかわからない場合は、"if" 条件を 3 つの明示的なチェックに分割することをお勧めします。

while ((c = getchar()) != '\n') {
    lineLengthCount++;
    if (lineLengthCount < 70) {
        putchar(c);
    }   

    if (lineLengthCount < 80 && (c == ' ')) {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   

    if (lineLengthCount == 80) {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   
}   

何が起こっているかを確認したい場合は、各「if」にデバッグ出力を書き込んで、呼び出されたときに通知します。

それが機能し、その理由を理解したら、それを編集して「if」を組み合わせることができます...

于 2013-03-10T19:56:14.580 に答える