7

K&R の The C Programming Language を読んでいて、putchar と getchar について混乱しています。10文字を入力すると、プログラムがそれらを画面に出力するプログラムを作成しました。

#include <stdio.h>

int main() 
{
    int i;
    int ch;
    for(i = 0; i < 10; i++)
    {
        printf("Enter a single character >> ");
        ch = getchar();
        putchar(ch);
    }

    return 0;
}

次のような出力が得られると予想していました。

Enter a single character >> a
a
Enter a single character >> b
b

...など10回ですが、これは私が得た出力です:(2文字を入力した後に停止しました)

Enter a single character >> a
aEnter a single character >>
Enter a single character >> b
bEnter a single character >>
Enter a single character >>

入力文字が固定文字列と組み合わされて出力される理由がわかりません。

また、文字を格納するために int が使用される理由もよくわかりません。

4

8 に答える 8

3

ユーザー端末は、標準モードと非標準モードで動作できます。デフォルトでは、標準モードで動作します。これは、プログラムが標準入力を行ごとに (シンボルごとではなく) 使用できることを意味します。問題のユーザーは何かを入力し (文字 'a'、16 進数で 0x61)、Enter キーを押します (16 進数で改行文字 '0x0A')。アスキーテーブルはこちら. したがって、このアクションはプログラムに 2 つのシンボルを与えます。man getchar() で述べたように、シンボルごとに読み取ります。したがって、ループは 1 文字に対して 2 回繰り返されます。何が起こっているかを確認するには、次のプログラムを使用します (+ループ カウンターの出力、+文字コードの出力)。

#include <stdio.h>
#include <unistd.h>

int main() 
{
  int i;
  char ch;
  for(i = 0; i < 10; i++)
  {
    printf("Enter a single character %d >>", i);
    ch = getchar();
    printf("Ch=0x%08X\n", ch);
    /*putchar(ch);*/
  }

  return 0;
}

出力:

┌─(02:01:16)─(michael@lorry)─(~/tmp/getchar)
└─► gcc -o main main.c; ./main 
Enter a single character 0 >>a
Ch=0x00000061
Enter a single character 1 >>Ch=0x0000000A
Enter a single character 2 >>b
Ch=0x00000062
Enter a single character 3 >>Ch=0x0000000A
Enter a single character 4 >>^C

したがって、プログラムは 2 つのシンボルを取得し、それらを出力します。また、改行記号は表示されません。したがって、質問のユーザーには、奇妙な追加の行が1つ表示されます。さまざまな端末モードの詳細な説明とその調整方法については、こちらを参照してください。

また、sttyユーティリティは、端末オプションを操作する際にも役立ちます (「icanon」は、端末が標準モードを使用するかどうかを示します)。 getchar() 出力に char を int として格納する方法については、同様のトピック

について私の回答を参照してください。

于 2013-10-31T22:13:53.387 に答える
0

偶数回のループは、getchar()キーボードからの入力ではなく、前に入力されたヒットから取得されるため、ループが 5 回しか実行されないことにも気付くでしょう。したがって、バッファをクリアする必要があります。つまり、Enter キーを押して、新しい文字をch.

for (i = 0; i < 5; i++)
    {
        printf("\nEnter a single character >> "); // new line
        ch = getchar();
        while (getchar() != '\n'); //Clearung buffer.
        putchar(ch);
    }
于 2016-06-25T19:32:37.487 に答える
0

理想的かどうかはわかりませんが、これはうまくいきました:

    #include <stdio.h>
    int main() 
    {
       int i;
       int ch;
        for(i = 0; i < 10; i++)
        {
            printf("Enter a single character >> ");
            getchar();
            ch=getchar();
            putchar(ch);
         }

         return 0;
       }
于 2017-04-18T00:36:43.097 に答える