2011-07-10 14 views
5

これはおそらく非常に単純な問題ですが、私が新しいものとして私を許します。ここ は私のコードです:getlineは入力を求めていませんか?

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

int main() 
{ 
    string name; 
    int i; 
    string mystr; 
    float price = 0; 

    cout << "Hello World!" << endl; 
    cout << "What is your name? "; 
    cin >> name; 
    cout << "Hello " << name << endl; 
    cout << "How old are you? "; 
    cin >> i; 
    cout << "Wow " << i << endl; 

    cout << "How much is that jacket? "; 
    getline (cin,mystr); 
    stringstream(mystr) >> price; 
    cout << price << endl; 
    system("pause"); 

    return 0; 
} 

問題がhow much is that jacket?のgetlineを尋ねられたときの入力をユーザーに尋ねると、ちょうど「0」の初期値を入力しないことです。どうしてこれなの?

+1

注:これは何度も要求されています。ここにいくつかいくつかのhttp://stackoverflow.com/questions/3731529/program-is-skipping-over-getline-without-taking-user-input http://stackoverflow.com/questions/1744665/need-help- with-getline http://stackoverflow.com/questions/4876959/ignore-spaces-using-getline-in-c – cpx

答えて

12

あなたはgetlineoperator>>を混合する際に注意する必要があります。問題は、operator>>を使用すると、ユーザーがデータを入力した後、Enterキーを押して、改行文字を入力バッファに入れます。 operator>>は空白で区切られているので、改行文字は変数に入れられず、入力バッファーにとどまります。次に、getlineと呼ぶと、それが探しているのは改行文字だけです。これがバッファーの中の最初のものなので、すぐに探しているものが見つかり、ユーザーにプロンプ​​トする必要はありません。

修正:あなたはoperator>>を使用した後getlineを呼ぶつもりなら 、間に無視する、またはその改行文字、getlineにおそらくダミーのコールを取り除くために何かを行う呼び出します。

もう1つの選択肢は、マーティンが話していたことに沿ったものです。operator>>を使用せず、getlineのみを使用して、必要なデータ型に文字列を変換します。これには、コードをより安全かつ堅牢にするという副作用があります。私が最初にこのような関数を記述します。

int getInt(std::istream & is) 
{ 
    std::string input; 
    std::getline(is,input); 

    // C++11 version 
    return stoi(input); // throws on failure 

    // C++98 version 
    /* 
    std::istringstream iss(input); 
    int i; 
    if (!(iss >> i)) { 
     // handle error somehow 
    } 
    return i; 
    */ 
} 

あなたは山車、ダブルスや他のもののために同様の機能を作成することができます。その後、これに代えて、int型に必要がある場合:

cin >> i; 

あなたがこれを行う:改行に達するまで

i = getInt(cin); 
+0

ベンジャミンさんありがとう!私はあなたを完全に理解しています – UzumakiDev

+0

なぜ私はすぐにこのサイトに参加しませんでしたか? -/ – UzumakiDev

+0

"return stoi(input)"は基本的に戻り値の型が文字列から整数に変換されるかどうかを意味しますか? – UzumakiDev

2

これは、以前の呼び出しの入力ストリームに'\n'が残っているためです。

cin >> i; // This reads the number but the '\n' you hit after the number 
      // is still on the input. 

インタラクティブなユーザ入力を行うための最も簡単な方法は、(ユーザーが各プロンプトの後にEnterキーを押しますと)必ず各行が独立して処理されるようにすることです。

その結果、常に行を読み、ストリームを熟知するまで行を処理します。

std::string line; 
std::getline(std::cin, line); 

std::stringstream linestream(line); 

// Now processes linestream. 
std::string garbage; 
lienstream >> i >> garbage; // You may want to check for garbage after the number. 

if (!garbage.empty()) 
{ 
    std::cout << "Error\n"; 
} 
+0

私は分かりませんか?だから私はゲットラインに入力を求めるように正確に何を提案しますか?申し訳ありません私は完全なn00bです – UzumakiDev

+0

私はもう一度やっていることを理解するとすぐにこれを念頭に置いておいていただきありがとうございます..歓声 – UzumakiDev

+0

私はこの非常に有用な[リンク] http://augustcouncil.com/を見つけました〜tgibson/tutorial/iotips.html [link] – UzumakiDev

2

は、いくつかの文字を無視します。

cin.ignore(256, '\n') 
getline (cin,mystr); 
+0

もう少し説明していただけますか? 256文字を無視するのはなぜ1バイト以上ではないのですか?なぜ256文字ですか? – UzumakiDev

+0

入力ストリームから抽出または無視するのは_最大数の文字です。あなたは入力の長さに応じて256より大きい数値を持つことができます。あなたの場合、 'name'文字列の入力文字の最大長を256と仮定しました。 – cpx

関連する問題