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