2017-08-15 8 views
-6
#include <iostream> 
using namespace std; 

int main() 
{ 
    char ar[4][30]; 
    int i=0,t; 
    cout << "Enter Test cases"<< endl; 
    cin>>t; 
    for(i=0;i<t;i++) 
    { 
     gets(ar[i]); 

    } 
    return 0; 
} 

このコードから、複数の文字列を入力します。さて、テストケースの数を入力すると、ar [i]がテストケースよりも1つ少ない文字列を受け入れるという問題になります。なぜこのコードが動作しないのか分かりません。 私は日食に取り組んでいます。Forループが動作していませんC++

+0

なぜあなたは 't'の値を初期化していませんか? –

+0

@ItbanSaeed入力から値が割り当てられています。初期化する必要はありません。 – iBug

+0

@ItbanSaeed彼はそれをユーザー入力として受け取ります。問題は、彼が自分の '' 'ar [i] [j]' '配列の値を決して初期化していないことと、' 'gets()' '関数を使って値を取り出すことです。 –

答えて

1

cin >> tを実行すると、読み込まれている入力バッファに改行が残っていて、firsr getsが呼び出されます。

これは、ユーザ入力されているとします、入力バッファはあなたがgetsを呼んで初めて、それはar[1]と、入力し、リターンを

<ENTER> 
AAA 
BBB 

cin >> t

2 
AAA 
BBB 

読み取ります空の文字列に設定します。

Enter(を含む)の前にすべてを破棄するには、cin.ignore()またはgetsを追加することをお勧めします。

cin >> t; 
-> gets(NULL); 
0

あなたがバッファに格納されたデータのサイズ制限を傾けるための機能getsは非常にエラーが発生しやすい - >バッファオーバーフローを。それを使用しないでください。

fgets()の代わりに3という数字を入力して、配列の範囲外に書き込むこともできます。動的

#include <iostream> 
using namespace std; 

int main() 
{ 
    char ar[4][30] = { 0, }; 
    int i = 0, t; 
    cout << "Enter Test cases" << endl; 
    cin >> t; 
    cin.ignore(); 

    if (t > 3) 
     t = 3; 

    for (i = 0; i<t; i++) 
    { 
     fgets(ar[i], 30, stdin); 
    } 

    for (int i = 0; i < t; i++) 
    { 
     std::cout << ar[i]; 
    } 

    return 0; 
} 

入力

Enter Test cases 
5 
test1 
test2 
test3 

出力

test1 
test2 
test3 

あなたはより多くのこと3行を挿入したい場合は、より大きなバッファを作成する必要があり、 かは、ユーザーが入力した行数を割り当てます。


cin入力バッファに最終行文字を残します。あなたはそれをクリアする必要があります。

  • cin.ignore()を修正する必要があります。
関連する問題