2

私はプログラミングは初めてではありませんが、C++ には比較的慣れていません。簡単なコンソール アプリケーションを配布して、学習しながら他の人を助けることができるようにしたいと考えています。私の大学のキャンパスにあるマシンの大部分は Windows ベースで、デフォルトで Borland コンパイラがインストールされています。g++ やその他のツールを使用して、Linux ベースのシステムで開発を行うことを好みます。したがって、ユーザーがEnterキーを押すまでプログラムを実行したままにするクロスプラットフォームの方法を追加したいと思います。これにより、ユーザーは、Windows のコンソールで実行するのではなく、exe をダブルクリックした場合でも、出力を表示できます。これを行うために、次のようなものを書きました。

#include <iostream>

using namespace std;

int main()
{

    float val1, val2;
    bool wait = true;

    cout << "Please enter the first value to add: ";
    cin >> val1;
    cout << "Please enter the second value to add: ";
    cin >> val2;
    cout << "Result: " << val1 + val2 << endl << endl;

    cout << "Press enter to exit...";

    while (wait)
    {
        if (cin.get() == '\n')
            wait = false;
    }

    return 0;
}

上記のコードを使用すると、プログラムは結果を表示した後に終了します。ただし、cin 呼び出しをコメント アウトすると、期待どおりに機能します。これにより、cin.getline が最後のデータ入力からエンター キーの押下を取得していると思われます。これは、ループのきつさによるものだと思います。C++ にはクロスプラットフォームのスリープ機能がないことを知ったので、それはオプションではありません。この作業を行うために他に何ができますか?

4

2 に答える 2

4

あなたは付け加えられます

cin.ignore(1);

また

cin.ignore(INT_MAX, '\n');

あなたが電話する前にcin.get()。これにより、ユーザーが入力した 2 番目の数字またはバッファー内のすべての文字から改行までの改行が無視されます。

getまた、 to の戻り値を比較し'\n'たり、ループに入れたりする必要もありません。ユーザーはget戻るためにEnterキーを押す必要があるため、

cout << "Press enter to exit...";
cin.ignore(INT_MAX, '\n');
cin.get();

十分なものです。


するとどうなるか

cout << "Press enter to exit...";
while (wait)
{
    if (cin.get() == '\n')
    wait = false;
}

ということでループに入り、cin.get()呼び出されます。ユーザーは、必要に応じてコンソールに任意の量のテキストを入力できます。彼らが入ったと言う

Hello

コンソールで。次に、ユーザーは Enter キーを押します。cin.get()を返しHello\nまだバッファに残っています。と比較Hして\n、それらが等しくないことを確認したら、ループを続けます。cin.get()が呼び出され、バッファに既にテキストがあるため、eすぐに戻ります。このループは、バッファの最後の文字に到達するまで時間を浪費し続け、\ntrue と比較すると\nループが中断されます。ご覧のとおり、これは時間の無駄です。

ループに入れcin.get()てその戻り値を と比較すると、 に遭遇する前にファイルの終わりに到達する\n危険性もあります。これがあなたのプログラムに与える影響は無限ループになると思いますが、Windows で試すことができないのでわかりません。cin\n

また、そもそもループを使用する必要がない場合でもbool、ループを

while (true)
    if (cin.get() == '\n') break;
于 2011-09-02T23:31:00.893 に答える
0

cin >>`\n' までバッファ内のすべての文字を無視する必要があります。

#include <limits> // for std::numeric_limits as indicated by Marlon

std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

次に、次の行を待つことができます:

cout << "Press enter to exit...";
cin.get();
于 2011-09-03T00:05:05.117 に答える