2017-03-17 20 views
-1

私は何かのエミュレータを作成しようとしています。プロセッサのメインループでは、各ループのEnterキーを押すとプロンプトが表示されます)、各ステップでどのような指示が実行されているかを確認できます。さらに、デフォルトのステップ量を1から別の値に変更するために、Enterだけでなく数値を入力することもできます(xサイクル数をスキップしてから、1度に1に戻る)。C++ - fgets()は、Enterキーが押された場合に次の入力を無視します。

問題数字を入力すると(サイクル数をスキップして各サイクルをもう一度促します)、数字を入力するのではなくEnterキーを押すと、デフォルトの1ステップにしたい場合はEnterキーを押しますそれだけで

void CPU_loop() 
{ 
    ... 


    static int step = 1; 
    char cmd[10]; 
    if(step == 1) 
    { 
     if(fgets(cmd, 10, stdin) != NULL) // If you entered something other than Enter; doesn't work 
     { 
      step = std::atoi(cmd); // Set step amount to whatever you entered 
     } 
    } 
    else 
    { 
     --step; 
    } 

    ... 
} 
+0

ただ、手動で 'getchar'を使用して、自分自身を標準入力からの入力を読み込みます。改行文字を受け取るまで、テキストをバッファに入れてください。次に、あなたは望むようにテキストを処理することができます。 – bace1000

+0

Enterを押すと 'cmd'の値は何ですか?それでは、「ステップ」の価値は何になりますか? –

答えて

1

あなたが直接、Enterキーを押すと、それは1にデフォルト設定はありませんが、代わりにあなたはSTRを渡している== 1?。どのように入力します作るのですか二度と私にメッセージを表示せず、プログラム全体を通じて実行します"\n"std::atoi()に、std::atoi()はそれの入力に健全性チェックを実行するために使用することはできません、あなたはstd::strtol()のように、そのために別の機能を使用することができますINGのか、std::atoi()が入力として"\n"を取るとき、ので、あなたは、単に

if (step == 0) 
    step = 1; 

を追加することができ、 0を返します。それをさらに理解するためにdocumentationを読んでください。ドキュメントを成功にSTRの内容に対応する

整数値を引用

。変換された値が対応する戻り値の型の範囲外にある場合、戻り値は未定義です。 変換が実行できない場合は、0が返されます。

さらにもう1つ、これを避けるために入力用のストリームを使用するC++の方法があります。

あなたが行うことができ
+0

ありがとう!これは完璧に機能しました。私はこの問題がatoiではなくfgetsに由来していると思っていました。私は間違った問題を解決しようと1時間以上無駄にしていないことを望む! –

0

if (fgets(cmd, 10, stdin) != NULL) 
{ 
    if (cmd[0] == '\n'){ 
     step = 1; 
    } 
    else{ 
     step = std::atoi(cmd); // Set step amount to whatever you entered 
    } 
} 
+0

申し訳ありませんが、ENTERを押すと、\ n "' 'std :: atoi()'に渡されます。 –

+0

すみません。編集されました。 – ChrisB

関連する問題