C++ getline()未填充整个字符串数组
我编写这段代码是为了从控制台输入中读取N行,并将其放入字符串数组中,但它是 读N-1行 有什么建议吗C++ getline()未填充整个字符串数组,c++,visual-c++,C++,Visual C++,我编写这段代码是为了从控制台输入中读取N行,并将其放入字符串数组中,但它是 读N-1行 有什么建议吗 #include<iostream> #include<stdio.h> #include<string> using namespace std; int main() { int test; cin>>test; string *cases=new string[test]; for(int i=0;i<test;i++) {
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int main()
{
int test;
cin>>test;
string *cases=new string[test];
for(int i=0;i<test;i++)
{
getline(cin,cases[i],'\n');
}
for(int i=0;i<test;i++)
{
cout<<cases[i]<<endl;
}
system("pause");
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
智力测验;
cin>>试验;
字符串*案例=新字符串[测试];
对于(int i=0;i让我们假设您的输入如下:
2\n
line 0\n
line 1\n
然后在cin>>测试之后
,顶部有一条空行:
\n
line 0\n
line 1\n
使用>
只读取它感兴趣的位(即int
),然后在流中留下任何其他内容(在本例中,只读取\n
,但仔细想想,可能会有各种各样的内容)。
getline
读取到\n
的所有内容,然后从流中删除\n
。
因此,在第一个getline
之后,剩余的输入是:
line 0\n
line 1\n
而案例[0]
包含“
(即空字符串)
然后在下一个getline
之后:
remaining input:
line 1\n
及
然后循环停止,因为它已读取2行。
这就是问题所在。修复它是另一回事。我更喜欢避免混合>
和getline
。但是您可以做一些事情来清除流中的尾部\n
编辑:您也可以好好阅读一下(文档可能有点技术性——搜索教程)和
我提出了一种解决方法。注意,只有c++11。如果您没有可用的方法,您可以尝试使用>
,或
#包括
#包括
#包括
int main()
{
int inLines=0;
//std::cin>>内联线;
std::字符串计数行;
std::getline(std::cin,countLine);
尝试
{
inLines=std::stoi(计数线);
}
捕获(…)
{
std::cout给出一个示例输出,解释什么是错误的它是>
和getline
的组合。输入int
后,该行的其余部分(实际上可能不包含任何内容)将被读入案例[0]
。我总是发现最简单的方法就是不要混合使用>
和getline
。感谢您解释这个问题,我用scanf(“%d\n”,&test)修复了它);有更好的方法吗?我添加了一种可能的方法。使用scanf
解决了这个特殊问题,但基本上仍然意味着您混淆了输入方法,这可能会造成麻烦。再次感谢您对我的帮助^_^
cases[0]: ""
cases[1]: "line 0"
#include <iostream>
#include <vector>
#include <string>
int main()
{
int inLines = 0;
//std::cin >> inLines;
std::string countLine;
std::getline(std::cin, countLine);
try
{
inLines = std::stoi(countLine);
}
catch (...)
{
std::cout << "First line must be an integer\n";
return 1;
}
std::vector<std::string> lines(inLines);
for (int i = 0; i < inLines; ++i)
{
std::getline(std::cin, lines[i]);
}
for ( auto & s : lines )
{
std::cout << s << '\n';
}
return 0;
}