2017-08-15 188 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()应该修复它。