3

私は他のいくつかの質問を見ましたが、私はC ++が初心者すぎて、ここで私の質問に当てはまるかどうかを知ることができません..

基本的に、「名前」の出力を表示するときに、フルネームを入力すると、2 番目の単語のみが表示されます。以前は、何も取得することさえなく、単にスキップしていました。私は今、一見単純に見える何かに混乱しています。ありがとう。

#include <iostream>
#include <string>
using namespace std;

int main()
{
double money;
string name;
int age;

// Prompt for age and receive
cout<<"How old are you? ";
cin >> age;

// Prompt for money and receive
cout<<"How much money do you have?";
cin >> money >> endl;

// Prompt for name and receive
cout<<"What's your name?\n\n"<< endl;
getline(cin, name);

// Display all information to user
cout<<"Hello, "<< name <<".";
cout << "You are " << age << " years old";
cout<< " and have $" << money << ".\n";

system("PAUSE");
return 0;
}
4

2 に答える 2

4

問題は、フォーマットされた入力を使用して値を>>読み取り、値が完全に解析されると停止することです。たとえば、形式に一致しないものが表示されると、数字は完成されます。つまり、スペースまたは改行 (およびその他のかなりの数の文字) の直前で読み取りが停止します。通常、これらの余分な文字が問題を引き起こすことはありません。フォーマットされた入力は、実際の値を読み取ろうとする前に先頭の空白 (スペース、タブ、改行など) をスキップすることから始まるためです。

ただし、フォーマットされていない入力は、たとえば、getline()その値の読み取りをすぐに開始し、改行 (または 3 つの引数バージョンが使用されている場合は改行文字として指定された文字) に遭遇すると停止します。つまりgetline()、改行文字がストリームに残っている場合、改行文字を読み取った後すぐに停止します。

改行文字 (およびその他の先頭の空白) を取り除く最も簡単な方法は、次のように使用することstd::wsです。

if (std::getline(std::cin >> std::ws, name)) {
    ...
}

...そして、ところで、何かを読み取ろうとするときはいつでも、読み取りに値の読み取りが成功したことを常に確認する必要があります!

もう 1 つのアプローチは、std::getline()をまったく使用せず、代わりに書式設定された入力を にnameも使用することです。ただし、これは名前にスペースがないことを前提としています。

于 2013-08-29T22:34:44.077 に答える
0

それnewlineは、「いくらお金を持っていますか?」からの質問だからです。応答はまだ入力バッファーにあります。一般に、このような問題が発生するため、項目入力と行ベースの入力 (C とscanf/fgetsまたは C++>>とを使用するかどうかに関係なくgetline) を混在させることはお勧めできません。

この特定の状況は、char dummy = cin.get();before どこか beforeを使用することで修正できgetlineますが、「項目入力」から「行入力」に切り替えるたびにこれを行う必要があり、後で順序を変更する場合は、移動することを忘れないでくださいcin.get()。 .

より良い解決策は、常に行ベースの入力を使用stringstreamし、文字列からデータを取得するために使用することです。次のようになります。

string ageString;
getline(cin, ageString);
stringstream ageSs(ageString);
if (!ageSs >> age)
{
    cout << "Bad input" << endl;
    exit(1);    // You may of course want to repeat rather than exit... 
}

そうすれば、入力が何であれ、行全体を読み取ることができます。

于 2013-08-29T22:28:02.163 に答える