0

私はしばらくの間、C で getchar() を完全に使用する際に問題を抱えていました。この場合、行を読み取って行の文字を配列に入れようとしています。ただし、 getchar() を配列に割り当てると、一部の文字がスキップされます。

たとえば、「1 つおきにスキップする」という入力の場合、出力は...I\n \nk\np\n \nv\nr\n \nt\ne\n になります。( \n は改行を表すためのものです。)

int N = 0;

char message[80] = {};

do
{
    message[N] = getchar();
    N++;
    printf("%c\n", message[N-1]);
}
while(getchar() != '\n');

前に述べたように、 getchar() を使用しようとしたほとんどの場合、常に予期しない結果が得られます。関数が文字を読み取る方法が完全にはわかりません。

4

2 に答える 2

8

getchar() を while 条件で 1 回と do-while 本体内で 2 回呼び出しています。

代わりに次のコードを試してください。

int N = 0;
#define MAX_SIZE 80

char message[MAX_SIZE] = {};
char lastChar;

do
{
    lastChar = getchar();  
    if (lastChar == '\n')
        break; 
    message[N] = lastChar;
    N++;
    printf("%c\n", message[N-1]);
}
while(N < MAX_SIZE);

更新: 無限の do-while ループを使用する代わりに、配列の最大サイズのチェックを追加しました。

于 2013-02-27T06:58:21.990 に答える
3

getchar()ループを介して毎回 2 回呼び出しています。呼び出すたびgetchar()に 1 文字消費します。getchar()したがって、条件を呼び出す代わりに、の値を改行文字while( ... )と比較します。message[N]

于 2013-02-27T06:59:40.463 に答える