2017-02-12 5 views
0

文字がqの場合はループが途切れ、ユーザーから文字を取り出して印刷する簡単なコードを記述しています。私が得た出力はprintステートメントを2回印刷し、2度目は印刷しません。画像を見てください。なぜ2回印刷されていますか?whileループはgetchar()とputchar()を使用して同じステートメントを2回出力します。

#include<stdio.h> 
void main() 
{ 
    char c; 
    printf("Enter a character: "); 
    c=getchar(); 
    while(c!='q') 
    { 
    putchar(c); 
    printf("\nEnter a character: "); 
    c=getchar(); 
    } 
} 
+2

質問は、質問自体の内部コード、所望の出力と入力が含まれている必要があります。スクリーンショットはありません。 [mcve]を投稿してください – StoryTeller

+0

コードは画像ではありません投稿してください - 読むことができません –

+0

改行をスキップしてください... – BLUEPIXY

答えて

2

あなたはリターン/は、入力の一部として、Enterキーを押しています。それは入力ストリームに残され、すぐ次の反復でgetcharによってピックアップされます。フォーマットされた入力がオプションである場合

することは、あなたは、文字入力を待っている時に空白文字をスキップするscanfを使用することができます。

scanf(" %c", &c); // Note the leading white-space, it's what does the skipping 

あなたはは、getcharを使用し続け、その戻り値の型に注意を払って、そのない場合intです。入力ストリームが使い尽くされたときにはEOFを返し、その値は有効な文字ではなく整数です。

+0

ありがとうございました!それはうまくいった。質問があります。 getchar()関数は反復処理ごとに1文字を使用すべきですか?なぜ2回目の反復で入力としてリターンを取るのですか? –

+0

@ManikumarPerla - 入力ストリームがバッファされているためです。ハードウェアのキーストロークは、 'getchar'を呼び出すたびにプログラムが読み込む特別な配列に格納されます。入力が失われないように設計されています。 – StoryTeller

+0

さらにポイントを返す文字_is_文字。 'x'と打ち込んで戻ると、2つの文字が入力されます。 'getchar()'関数は、文字を出力するだけでなく、すべての文字を読み込みます。 –

2

バッファとは何ですか?
一時記憶域はバッファと呼ばれます。すべての標準入力および出力デバイスには入力および出力バッファが含まれています。標準のC/C++では、ストリームがバッファリングされます。たとえば、標準入力の場合、キーボードのキーを押すとプログラムには送信されず、プログラムに時間が割り当てられるまでオペレーティングシステムによってバッファされます。

"while((getchar())!= '\ n');"バッファの文字を最後まで読み込み、改行を含めて破棄し、それを使用して入力バッファをクリアし、コンテナ。

次のコードはうまく動作します:コードで助けを求め

#include<stdlib.h> 
void main() 
{ 
    char c; 
    printf("Enter a character: "); 
    c = getchar(); 
    while(c != 'q') 
    { 
     putchar(c); 
     // flushes the standard input (clears the input buffer) 
     while ((getchar()) != '\n'); 
     printf("\nEnter a character:"); 
     c = getchar(); 
    } 

} 
+0

ありがとう!それはうまくいった。 –

関連する問題