2

私は「The C Programming Language」(K&R) に取り組んでいて、演習の 1 つを行いました。課題は、EOF までのスペース、タブ、および改行の数を出力することでした。素晴らしい、それはうまくいきます。しかし、私は賢くなり始め、実際に「スペース」または「タブ」または「改行」と言う以下のprintf()を追加しました。入力するとそれが出力されるはずですが、Enter キーを押したときにしか while ループが実行されないようです。

コード:

#include <stdio.h>

int main(int argc, const char * argv[])
{

    int c, nb, nt, nl;

    nb = nt = nl = 0;

    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            nb += 1;
            printf("Space\n");
        }
        if (c == '\t') {
            nt += 1;
            printf("Tab\n");
        }
        if (c == '\n') {
            nl += 1;
            printf("New Line\n");
        }

    }

    printf("%d spaces, %d tabs, %d newlines",nb,nt,nl);

    return 0;
}

出力:

a b
Space
New Line
c d e
Space
Space
New Line
f   g
Tab
New Line
3 spaces, 1 tabs, 3 newlines

私が期待していたのは、次のようなものでした。

a Spaceb
New Line
c Spaced Spacee
New Line
f   tabg
New Line
3 spaces, 1 tabs, 3 newlines

では、なぜ期待したものではなく、得たものを得るのですか?

そして、はい、もし私が本当に気にかけていたら、「スペース[s]」、「タブ[s]」、「改行[s]」という言葉を値に基づかずに複数形にしますが、それは単なる演習です. ;)

4

1 に答える 1

1

お使いの端末は正規モードです - 文字は行末まで蓄積されます。その後、ユーザーに送信されます (1 つずつ)。

すぐに応答が必要な場合は、端末を raw モードに切り替える必要があります。

PS。多かれ少なかれ、次のようになります。

struct termios t;

tcgetattr (0, &t);

t.c_lflag &= ~ICANON;
t.c_cc [VMIN] = 1;
t.c_cc [VTIME] = 0;

tcsetattr (0, TCSANOW, &t);
于 2012-11-27T20:54:02.613 に答える