2016-08-14 6 views
1

私は画面をクリアして次の画面に移動する前に何かを表示しているプログラムを作成しようとしています。私は画面をクリアするためにシステム( "クリア")を使用しています。しかし、私はそれがちょうどスクリーンの速さをあまりにも速くクリアすることに気付いています。つまり、getchar()を実行しても、キーボード入力を待たずに次のコマンドを実行するということです。私は理由を理解することができません!ここで画面をクリアする前にキーボード入力を待つ方法(getchar not working)

は、キーストロークを待つことになっている一時停止マクロのための私のコードです:

#define pause() \ 
do{ \ 
    cout<<"Press any key to continue";\ 
    getchar();\ 
} while(0); 

そしてここでは、上記のマクロを使用するコードが、以下のコードキーが押されるのを待つしないのです画面をクリアする前に!

void registerUser() 
{ 
    string uid,passwd; 
    cout <<"Enter UID: "; 
    cin >> uid; 
    cout<<" Enter Password: "; 
    cin>>passwd; 
    bool ret = addUser(uid,passwd); 
    if (ret == false) 
    { 
     cout<<"User "<< uid <<" already exists\n"; // This message is not displayed 
    } 
    else 
    { 
     cout<<"User " << uid <<" Successfully added\n"; // This message is not displayed 
    } 
    pause(); // Program does not wait here as expected 
    system("clear"); // Screen is cleared immediately !! 
} 
+0

なぜインラインを使用しないのですか?マクロはこのための良いツールではありません –

答えて

3

std::cin入力ストリーム(典型的にstdin)から文字を読み取ります。デリミタを読み込むと停止し、デフォルトの区切り文字は\nです。

したがって、シーケンスを読み取るとき、ストリームの末尾に改行が残っています

getchar()は、\nを読み取り、戻ります。そのため、一時停止はありません。あなたは、ストリームから改行を削除する必要があります:

std::cin.ignore(); //Discards 1 character from the stream 
2

getchar「働く」、問題はあなたのケースでは、あなたが改行を読んでいることをcin >> passwd;によって残されます。

これを解決する適切な方法は、cin.ignore(1000, EOF);です。これは、次の改行までのすべての文字を無視します。

また、画面を消去しないで、過去に行ったことをスクロールして確認して画面を消去すると、その画面を消去することができます。

関連する問題