2011-11-23 9 views
11

これは初めてstackoverflowを使用しています。私はgetl​​ineに関して必要な情報を見つけることができませんでした。私はエンジニアリング転送のための簡単なプログラミングクラスに入っているので、私たちが書いたコードはかなり簡単です。私がここでやろうとしているのは、ユーザーが定義した数の質問と回答を2つの異なる配列に入れていることだけです。私は一部を入力答えだけでなく、ファイルへのセーブデータを指摘getline +の文字列について私は何を理解していませんか?

int main() 
{ 
    srand((unsigned)time(0)); 
    string quest1[100], answ1[100]; 
    int size1, x = 0, num, count1, visit[100], shuffle[100]; 
    fstream flashcard1; 

    cout << "flashcard.cpp by NAME\n" << endl; 
    cout << "This program allows user to manipulate questions and answers for studying.\n" << endl; 
    cout << "\nHow many flash cards will be entered(MAX 100)? "; 
    cin >> size1; 
    cout << endl; 

    while(x < size1) 
    { 
     cout << "Enter Question: "; 
     getline(cin , quest1[x]); 
     cout << endl; 
     x = x++; 

     /* 
     cout << "Enter Answer: " << endl; 
     getline(cin,answ1[x]); 
     cout << endl; 
     flashcard1.open("flashcard1.dat", ios::app); 
     flashcard1 << quest1[x] << " " << answ1[x] << endl; 
     flashcard1.close(); 
     cout << "Data Stored." << endl; 
     */ 
    } 
} 

:私のwhileループは(私はそれが破壊停止する場合は、単に確認するためにforループを使用しますがしばらくに切り替えた)このようになりますデバッグ用ですプログラムを実行すると、最初の質問のgetlineはスキップされ、2番目の "質問入力"ループが表示され、getlineは残りの部分に対して機能します。したがって、size1が5の場合、プログラムは配列の位置1-4だけを塗りつぶします。助けてください。 これは、フラッシュカードを作成してシャッフルするのと同じことをするシンプルなフラッシュカードプログラムです。

+7

'x = x ++;'は未定義の動作です。 'x ++ '(あるいは' ++ x'、 'x + = 1'、' x = x + 1'、 'x - = -1' ....)でなければなりません。 –

+0

これはx ++と++ xはxの値を1ずつインクリメント/デクリメントすることでx自体を変更します。インクリメントが起こる前に、またはインクリメントが起こる前にxにx ++の値を割り当てることができる標準ではこれを指定していません)。 –

+4

+1の良い最初の質問です。 –

答えて

12

あなたは

cin >> size1; 

を行うときは、番号を入力してEnterキーを打つので、最初の反復をスキップするように表示されています理由があります。 cinの整数を読み取り、改行文字をバッファーに残しておき、getlineを呼び出すと、すぐにEnterキーを押すようになり、getlineは何も読み取られません(改行文字を読み込む前に停止するため)。改行し、空の文字列をquest1[0]に入れます。そしてそれがgetlineの残りの部分が「正しく」働く理由です。

ループの上にcin.ignore('\n')を追加すると、残念ならず「'\n'」を取り除くことができます。コード内の他のエラーを避けて動作させる必要があります。

UBを避けるため、x = x++をちょうどx++に変更することを忘れないでください。

+0

ありがとうございます!私は何年もの間、このような便利なコミュニティを経験していません! – Brent

+0

@Brentこれがあなたの質問に答えた場合は、あなたの質問に対する回答としてマークするために、その横のチェックマークをクリックしてください。 –

+0

私はお詫び申し上げます。私は以前にクラスに入っていて、自分のプログラムを編集できませんでしたが、これが正解であると仮定しました。私のループの上にcin.ignore( 'n)を追加したとき、ループ内の最初のcout文が返されることはありませんでした。ちょうど半ダースの時間を入力しないと – Brent