1
#include <stdio.h>

int main() {
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\t')
            printf("\\t");
        else if (c == '\b')
            printf("\\b");
        else if (c == '\\')
            printf("\\\\");
        else 
            putchar(c);
    }
    return 0;
}   

この場合、

hi how are you\doing

出力が得られます

hi\thow\tare\tyou\\doing

#include <stdio.h>

int main() {
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\t') {
            c = '\b';
            printf("\\t");
        }
        if (c == '\b') {
            c = '\b';
            printf("\\b");
        }
        if (c == '\\') {
            c = '\b';
            printf("\\\\");
        }
        putchar(c);
    }
    return 0;
}   

このプログラムを入力で実行すると

hi    how    are    you\doing

(大きなスペースはタブです)

私はこの出力を得る

hi\t\how\t\are\t\you\doing

コード:

#include <stdio.h>

int main() {
    int c;
    c = '\b'; 
    putchar(c);
    return 0;
}

これを実行すると、何も得られません。出力なし。シェルプロンプトに戻ります。

より正確には、最初のプログラムでは必要な出力が得られますが、2 番目のプログラムではバックスラッシュが毎回取得されます\tが、その後ではなく、どのようになったかを見て出力になる\と予想されます, is '\b' が原因です? もしそうなら、それはどのように機能しますか?しかし、もしそうなら、なぜ3番目のプログラムで同じことが起こらないのですか?\\\\t\t\

rasbian のデフォルト gcc コンパイラと Windows 用の mingw msys-gcc パッケージでこれを実行しました。

4

1 に答える 1

2

2 番目のプログラムがそのように動作する理由は、複数のifブロックに入るためです。

    if (c == '\t') {
        c = '\b';
        printf("\\t");
    }
    if (c == '\b') {
        c = '\b';
        printf("\\b");
    }
    if (c == '\\') {
        c = '\b';
        printf("\\\\");
    }
    putchar(c);

タブに遭遇すると、最初のブロックに入り\t、画面に出力されてから backspaceに変わりcます。

2 番目のブロックはc、バックスペースであるため入力されます (ちょうどそれを変更したため)。次に、そのブロックが画面に出力\bされるので、画面に\t\b表示されます。

putchar次に、バックスペースを書き込むために呼び出すとb、次の文字によって上書きされます。したがって、次の文字が書か\t\れると、画面に表示されます。

したがって、ここでの問題は、c複数回テストしていて、その間に変更する可能性があることです。これがタブでのみ発生する理由は、最初にタブ、次にバックスペース、次にバックスラッシュをチェックするためです。

else ifの代わりに使用するとif、複数のブロックに入ることはありません。

if (c == '\t') {
    c = '\b';
    printf("\\t");
}
else if (c == '\b') {
    c = '\b';
    printf("\\b");
}
else if (c == '\\') {
    c = '\b';
    printf("\\\\");
}
putchar(c);

この変更により、元の入力が与えられると、出力は次のようになります。

hi\how\are\you\doing
于 2016-08-16T18:31:33.117 に答える