2012-03-08 17 views
0

"Peter Johnson"のような文字列を入力するにはどうすればいいですか? 私のプログラムは1つの単一の名前しか読みませんが、スペースを入れるとプログラムは無限にループします Johnを書くことはできますが、スペース文字はそれをループにします。何故ですか?また、プログラムが完全に終了していない可能性があります。それはスペースを見つけたときになぜプログラムは無限ループするのですか?

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int x=0; 
    char name [25]; 
    float paycheck; 

    cout<<"WELCOME TO THE EMPLOYEE SALARY GENERATION PROGRAM\n\n"; 

    while (x!=-1) 
    { 
     cout<<"Enter employee name or -1 to stop the program\n"; 
     cin>>name; 
     cout<<"Enter employee code (1=manager, 2=worker, 3=comission, 4=pieceworker) or -1   to stop the program\n"; 
     cin>>x; 

     switch (x) 
     { 
     case 1: 

      cout<<"Your weekly total paycheck is 2 500 $\n"; // FIXED weekly manager's  salary 
      break; 

     case 2: // 8.50 per hour + over time for workers 
      cout<<"Please enter the amount of hours worked\n"; 
      cin>>paycheck; 
      if(paycheck<40) 
        paycheck=paycheck*8.50; 
      else 
        paycheck= (paycheck-40)*8.50 +(40*8.50); 
      cout<<name<<"'s paycheck is "<<paycheck<<"$\n"; 
      break; 

     case 3: // comission workers make 250 + 5.7% of their weekly sales 
      cout<<"Please enter amount of weekly sale made\n"; 
      cin>>paycheck; 
      paycheck = paycheck*5.7/100 + 250; 
      break; 

     case 4: // pieceworkers make 50$ per item produced 
      cout<<"Please enter the number of items produced this week\n"; 
      cin>>paycheck; 
      paycheck = paycheck*50; 
      cout<<"The employee"<<name<<"Made"<<paycheck<<"$ this week"; 
      break; 

     default: 
      break; 
     } 
    } 

    system ("PAUSE"); 
} 
+6

あなたのコードを質問に貼り付けてください(あなたは編集を使ってそれに戻ることができます)。強調表示し、 "{}"ボタンをクリックしてフォーマットします。あなたはそれが正しいかどうかを見るために、下のプレビューでそれを見るでしょう。 – FatalError

+0

申し訳ありません - あなたの現在のコードに何が間違っているかについてコメントするには、少なくともいくつかのソースコードが必要です。ここに入れる方法は、各行の前に4つのスペースを入れてコピーして貼り付けるか、pastebinを使用してください。 – lochok

+3

@lochok:ここからペーストビンにリンクしないでください。 –

答えて

1

'CIN' 機能は、読み取りを停止します。名前を読むには 'getline'を使います。

EDIT:コードをデバッグし、不正な入力によるプログラムのクラッシュを避けるための安全対策を追加しました。これがあるから

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

float foo() 
{ 
    float fl = 0.0f; 
    string str; 
    while(true) { 
     getline(cin, str); 
     stringstream sstream(str); 
     if (sstream >> fl) 
      break; 
     cout << "Invalid Input" << endl; 
    } 
    return fl; 
} 

int main() 

{ 
    string x; 
    string name; 
    char number = {0}; 
    float paycheck; 

    cout << "WELCOME TO THE EMPLOYEE SALARY GENERATION PROGRAM" << endl << endl; 

    while (x!="-1") { 
     cout << "Enter employee name or -1 to stop the program" << endl; 
     getline(cin, name); 
     if (name == "-1") return 0; 

     cout<<"Enter employee code (1=manager, 2=worker, 3=comission, 4=pieceworker) or -1 to stop the program\n"; 
     getline(cin, x); 
     if (x == "-1") return 0; 
     if (x.length() == 1) 
      number = x[0]; 
     else { 
      cout << "Invalid Input" << endl; 
      continue; 
     } 

     switch (number) { 
     case '1': 
      cout << "Your weekly total paycheck is 2 500 $" << endl; // FIXED weekly manager's  salary 
      break; 
     case '2': // 8.50 per hour + over time for workers 
      cout << "Please enter the amount of hours worked" << endl; 
      paycheck = foo(); 
      if(paycheck<40) 
       paycheck=paycheck*8.50; 
      else 
       paycheck= (paycheck-40)*8.50 +(40*8.50); 
      cout << name << "'s paycheck is " << paycheck << "$" << endl; 
      break; 
     case '3': // comission workers make 250 + 5.7% of their weekly sales 
      cout << "Please enter amount of weekly sale made" << endl; 
      paycheck = foo(); 
      paycheck = paycheck*5.7/100 + 250; 
      break; 
     case '4': // pieceworkers make 50$ per item produced 
      cout<<"Please enter the number of items produced this week" << endl; 
      paycheck = foo(); 
      paycheck = paycheck*50; 
      cout<<"The employee " << name << " Made "<< paycheck << "$ this week" << endl; 
      break; 
     default: 
      cout << "Invalid Option." << endl; 
      break; 
     } 
    } 
    system ("PAUSE"); 
} 
+0

うわー!ありがとう! なぜ人々はこの投稿を嫌ったのですか? –

+0

@Napster投稿は少し初心者ですが、最初はコードを提供していないので、あなたを助ける方法はありませんでした。 – Topo

+0

@Topo、プログラムを実行しましたか?ループの終わりに '' \ n ''が残っているので、次のループの 'getline'は失敗します。 –

1

主な教訓は離れて取る:常にチェックを読み取りが成功したことを読んだ後!それは進まなかった。一般的に、入力は次のようになります。

if (in >> var1 >> var2) { ... } 
if (std::getline(in, string)) { ... } 

...ループの条件で入力を使用します。あなたの主な問題は、最初にin >> sを使用している文字列の入力が先行スペースをスキップし、最初のスペースまでスペース以外の文字を読み取るように見えることです(スペースは実際にスペース、改行、改行、改行、 。複数の単語を読んでみたいのであれば、読み方を止めるべきかを判断する必要があります。たとえば、std::getline(in, s, c)(省略された場合、cのデフォルトは\n)を使用して、特定の文字まで読み取ることができます。

正常に解析できない値を読み取ろうとすると、次のようなエラーメッセージが表示されます。次の空白以外の文字が数字でないときに数値を読み込もうとすると、ストリームは失敗となり(つまり状態はstd::ios_base::failbitになります)、状態がclear()になるまでは何も行いません。

関連する問題