2012-02-28 9 views
1

私はユーザから複数のStringsintsを読み込もうとしています。私は、名前と年齢のペアを取って、ユーザーが「done」を入力するまでそれを続けます。しかし、私のdo-whileが早くクラッシュして、なぜ私は理解できませんか?ループが失敗している間に、intと文字列C++を読み込むとき

int number; 
string name; 
do 
{ 
cout << "Your name: " ; 
getline(cin, name);  
cout <<name<< " age: " ; 
cin >> number; 
} 
while (name!="done"); 

編集:「完了」と入力した後も、年齢にも「完了」と入力する必要があります。なぜですか?

+0

? – Rolle

+0

年齢を質問するときにNaNの値を入力するだけでいいのですが、 –

+0

名前と年齢の2つの値を入力できますが、2回目には最後の入力を100万回出力します。 – Handsken

答えて

2

VS 2010でプログラムを実行しようとしましたが、有効な番号を入力しても、プログラムは次の名前を読み飛ばしてスキップします。

cin >> number私は自然に数字の後に入力した '\ n'を飲み込まないようです。

cin >> numberの後にgetchar()の呼び出しを追加しようとしましたが、プログラムが驚いたことに期待通りに動作し始めました。

cin >> numberの後にclean()/ ignore()を入力しても問題ないとか、getline()を使って(そして解析して)数値を読み取っても結構です。

「完了」の年齢を入力しない場合は、入力した直後にループから抜け出す必要があります。私の最終的なコード:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    int number; 
    string name; 
    while(true) 
    { 
     cout << "Your name: " ; 
     getline(cin, name); 
     if(name == "done") 
      break; 
     cout <<name<< " age: " ; 
     cin >> number; 
     cin.clear(); 
     cin.ignore(std::numeric_limits<streamsize>::max(),'\n'); 
    } 
} 
+0

ありがとう!これは私の問題を解決しました! :) – Handsken

2

誰かが無効な年齢、つまり数字ではないものを入力した場合は、あなたのcinのフラグを消去し、残りの文字も消去する必要があります。

if(!(cin >> number) 
{ 
    cin.clear(); 
} 
cin.ignore(std::numeric_limits<streamsize>::max()); 

数値を読み取った場合は、改行を無視する必要があります。

+0

これは私に空白を与え、数字を入力した後、もう1回プログラムループを作るために入力する必要がありますか? – Handsken

+1

cinは決して私の強みではありません。実用的なコードで私は決してそれを使用しません。番号を入力すると、改行で終了し、次のgetline呼び出しのためにバッファに残っているかどうか質問します。読み込みが成功した後でも、それをスキップする必要があるかもしれません。 – CashCow

0

それはageとしてint型を期待しながら、あなたはそれを文字列を与えるので。最初の反復の終わりに

、あなたは 入力ageキーを入力し、余分な改行 cinに入れた入力されたとして。したがって、2回目の反復では、 改行が空の行として表示され、 nameが空の文字列として設定されました。その後、プログラムは ageとしました。十分な注意を払わないと、文字列を入力してプログラムがクラッシュします。

1つの提案:交換するには :

getline(cin, name); 

と:

do { 
    getline(cin, name);  
} while (name.empty()); 
1
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string name; 
    int age; 
    while (true) 
    { 
     std::cout << "Please enter your name: "; 
     std::cin >> name; 
     if ("done" == name) 
      break; 
     std::cout << name << ", please enter your age: "; 
     std::cin >> age; 
     std::cout << name << ", you are " << age << " years old\n"; 
    } 
    std::cout << "Bye.\n"; 
    return 0; 
} 

getline()>>の使用をミキシング問題となる可能性があります。可能ならばそれを避けるのがベストです。両方ともgetline()を使用し、stringstream、おそらくはatoi()を使用してintに変換することもできますが、あまり好きではありません。

1

は、std名前空間を使用し

この方法

int number; 
string name; 
do 
{ 
std::cout<<"Your name: " ; 
std::cin>>name;  
std::cout<<name<<" age: " ; 
std::cin>>number; 
} 
while (name!="done"); 

またはあなたの入力は、それがクラッシュいただきました。この

using namspace std; 
int number; 
    string name; 
    do 
    { 
    std::cout<<"Your name: " ; 
    std::cin>>name;  
    std::cout<<name<<" age: " ; 
    std::cin>>number; 
    } 
    while (name!="done"); 
関連する問題