6

K&R C 1-10の読み取り:

「入力を出力にコピーするプログラムを作成し、各タブを\ tに、各バックスペースを\ bに、各バックスラッシュを\に置き換えます。これにより、タブとバックスペースが明確に表示されます。」

私は次のコードを持っていますが、ターミナルが文字を食べるため、バックスペース文字では機能しません。これまでのところ、この本で取り上げられている資料を使った解決策はないようです。解決策は何でしょうか?

#include <stdio.h>

main()
{
    int c;

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

        switch (c) {
            case '\t':
                printf("\\t");
                break;
            case '\b':
                printf("\\b");
                break;
            case '\\':
                printf("\\\\");
                break;
            default:
                putchar(c);
        }
    }
}
4

2 に答える 2

5

これは、オペレーティングシステムがターミナルIOを処理しており、プログラムが文字を認識できるようになる前に、キーボードから文字を処理するためです。

Unix / Linuxシステムを使用している場合は、プログラムの実行を次のようにラップできます。

$ stty -icanon -echo; ./a.out; stty icanon echo

これにより、ターミナルドライバーが特定の方法で入力を処理できなくなります。icanonはバックスペース処理などの処理を有効にし、echoは入力した文字を印刷します。プログラムは文字自体をエコーするので、エコーをオフにすることができます。これに関する唯一の問題は、-icanonもEOF処理を停止するため、ループから抜け出すために条件を追加する必要があることです。

#include <stdio.h>

#define CTRL(x) (x & 0x1f)

main()
{
    int c;

    while((c = getchar()) != EOF && c != CTRL('d')) {
...

このようなプログラムをテストするときは、別のウィンドウで実行することもお勧めします。これにより、奇妙なターミナルモードに陥った場合に、セッション全体をすばやく簡単に強制終了できます。

于 2013-01-08T02:41:12.487 に答える
4

ここでは何も問題はありません。バックスペース文字を含むファイルでこのプログラムを実行すると、適切に変換されます。端末入力の場合、プログラムは入力ルーチンによって管理されるため、バックスペースを受け取りません。

于 2013-01-08T01:06:58.323 に答える