因为循环不是在运行C ++

时间:2017-08-15 05:24:10

标签: c++

#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]接受一个比测试用例少的字符串。我不明白为什么这段代码不起作用。  我正在研究日食。

2 个答案:

答案 0 :(得分:1)

执行cin >> t时,输入缓冲区中的换行符会被读取,并被送入第一个gets调用。

假设这是用户输入:

2
AAA
BBB

cin >> t之后,输入缓冲区为

<ENTER>
AAA
BBB

因此,当您第一次调用gets时,它会读取Enter并返回,并将ar[1]设置为空字符串。

您可能希望在Enter(包括)之前添加cin.ignore()gets以弃置所有内容。

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

答案 1 :(得分:0)

函数gets非常容易出错,因为您无法限制存储在缓冲区中的数据大小 - &gt;缓冲区溢出。不要使用它。

使用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()应该修复它。