2017-08-15 167 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]接受一個比測試用例少的字符串。我不明白爲什麼這個代碼不起作用。 我正在進行日食。For循環不工作C++

+0

爲什麼你沒有初始化't'的值? –

+0

@ItbanSaeed它被賦值爲來自輸入的值。無需初始化。 – iBug

+0

@ItbanSaeed他將其作爲用戶輸入。問題在於他從未在他的'''ar'i [j]'''數組中初始化任何值,並使用''''gets()''函數來檢索值。 –

回答

1

當您執行cin >> t時,輸入緩衝區中有一個換行符正在讀取,並被送入第一個調用。

假設這是用戶輸入:

cin >> t
2 
AAA 
BBB 

後,輸入緩衝區

<ENTER> 
AAA 
BBB 

因此,對於第一次調用gets,它讀取輸入並返回,與ar[1]設置爲空字符串。

您可能想添加一個cin.ignore()gets以放棄Enter(包括)之前的所有內容。 >緩衝區溢出 - 因爲數據的你不能極限尺寸存儲到緩衝器

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()應該修復它。