10

次のコードがあります。

main.cpp

#include <iostream>
#include <string>

using namespace std;

string name;
string age;

int main() {
    cout <<"Name: ";
    cin >> name;
    cout << endl;
    cout <<"Age: ";
    cin >> age;
    cout << endl;
    cout << "Your name is " << name << ", and you are " << age << " years old."  << endl;
    cout << "Press enter to close this application" << endl;
    getchar();
    return 0;
}

名前の入力にスペースを入れると、名前を入力する機会が与えられず、スペースの後のエントリが年齢として表示されることに気付きました。これが初心者の間違いである場合はお詫び申し上げます。私は以前に Java をプログラミングしていましたが、自分のニーズにより適しているため、C++ に切り替えることにしました。また、私のコードをあなたの標準に合わせてフォーマットすることもできます。必要に応じて修正してください。

コンソールのスクリーンショット

また、別のエラーにも気付きました。これは、Java で実際に問題が発生したことはありません。処理が終了したときにすぐに閉じないようにする方法がわかりません。"system.("pause"); が使えると聞いたことがありますが、私も使わないように言われました。何もしないようです。

C++に関しては完全な初心者なので、どんな助けでも大歓迎です。

4

3 に答える 3

16

プログラムを実行すると、入力バッファーで何が起こっているかを次に示します。

std::cin >> name;

入力を待っています。「Ryan Cleary」と入力して Enter キーを押すと、入力バッファには次のものが含まれます。

Ryan Cleary\n

これcinで、通常どおり入力を読み取り、空白で停止し、バッファを次のように残します。

 Cleary\n

を読んだ後に停止するため、最初のスペースに注意してくださいRyan。最初の変数には が含まれていますRyan。ただし、フル ネームが必要な場合は、 を使用しますstd::getline。空白だけでなく、改行まで読み取ります。とにかく、続けて:

std::cin >> age;

これで、別の入力が得られます。しかし、そこにはすでに何かがあります。読み取りを開始できるようになるまで空白をスキップし、バッファには次のものだけを残します。

\n

2 番目の変数は text を取得しますCleary。改行がまだバッファーにあることに注意してください。これにより、2 番目の部分に進みます。system ("pause");常に機能する方法で置き換えるのは難しいです。あなたの最善の策は、通常、完璧ではないソリューション、または私が好きなように、それが言うことを正確に行うことが保証されていないソリューションで暮らすことです:

std::cin.get(); //this consumes the left over newline and exits without waiting

さて、cin.get()うまくいきませんでした。これはどう:

std::cin.get(); //consume left over newline
std::cin.get(); //wait

それは完全に機能しますが、改行が残っていない場所にコピーして貼り付けるとどうなりますか? Enter キーを 2 回押す必要があります。

解決策は、改行 (およびその他のもの) をクリアしてから待機することです。これが の目的ですcin.sync()。ただし、注のセクションにあるように、バッファーをクリアすることは保証されていないため、コンパイラーがそうしないことを選択した場合は使用できません。ただし、私にとっては、まさにそれを行い、次の解決策を残します。

std::cin.sync(); //clear buffer
std::cin.get(); //wait

主な悪い点system("pause");は、他の人のコンピューターで実行されるプログラムがわからないことです。彼らはpause.exe最初に見つかったものを変更したり、配置したりする可能性があり、あなたは知る方法がありません. これは、おそらく任意のプログラムであるため、コンピューターを台無しにする可能性があります。

于 2012-07-12T23:26:12.200 に答える
7

cin.getlineを試す必要があります。そうすれば、ストリームは最初の改行文字まで読み取られます。

一部の人が指摘したように、悪いアドバイスです。std::getlineを使用して、行全体を読み取ることができます。繰り返しますが、通知がない限り、区切り文字は改行です。から読み取るにはcin、それを最初のパラメーターとして (および文字列を 2 番目のパラメーターとして) 渡すことができます。

std::string str;
std::getline(cin, str); // to read until the end of line

std::getline(cin, str, ' '); // to read until a space character, for instance

(もちろん、名前空間std::を使用していることを既にコンパイラーに通知しているので、行からその部分を省略できます)std

于 2012-07-12T23:10:24.593 に答える