我正在编写一个非常基本的问题,但我被困在一行中读取数组的输入。我使用了如何在一行中用户在 c++ 中输入数组元素中使用的技术,但我看到它不起作用,并且在后续执行步骤中给出了"分段错误"。我在下面包含了我的代码。
#include<iostream>
#include<sstream>
#include <string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n,i,j,max=0,k,l;
cin>>n;
for(i=0;i<n;i++)
{
vector<int> v1;
stringstream iss;
string s;
int value={0};
max=0;
getline(cin,s);
iss<<s;
while(iss>>value)
{
cout<<"Pushing values";
v1.push_back(value);
}
//cout<<"After pushing";
cout<<v1[0];
}
return 0;
}
它在线路cout<<v1[0];
中给出分段错误。实际上,值并没有被推入vector
,只需取消注释cout<<"After pushing";
并注释cout<<v1[0];
即可进行检查。
这里有什么问题?
实际上我的输入如下所示:
4
1 3 4
1 10 100
21 88 17
23 34 45
我还想知道在字符串中读取后如何分隔 nos 如果它们之间存在空格?
让我们来看看使用显式换行符的输入是什么样子的:
4n
1 3 4n
1 10 100n
21 88 17n
23 34 45n
cin >> n
后,剩余的未读输入将如下所示:
n
1 3 4n
1 10 100n
21 88 17n
23 34 45n
在第一个getline
之后,它将如下所示:
1 3 4n
1 10 100n
21 88 17n
23 34 45n
看到问题了吗?第一次从cin
读取值时,不会完全读取该行,以下getline
读取该行的其余部分(这是一个空字符串(。之后,您尝试将该行中的所有数字读入向量(由于它是空字符串,因此不会读取任何数字(,并尝试读取向量中的第一个数字(这将出错,因为没有添加任何数字(。
std::cin 在运算符>>
后保持n
。您可以简单地使用 cin.get()
来删除换行符。
固定代码:
#include<iostream>
#include<sstream>
#include <string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n,i,j,max=0,k,l;
cin>>n;
cin.get();
for(i=0;i<n;i++)
{
vector<int> v1;
stringstream iss;
string s;
int value={0};
max=0;
getline(cin,s);
iss<<s;
while(iss>>value)
{
cout<<"Pushing values";
v1.push_back(value);
}
//cout<<"After pushing";
cout<<v1[0];
}
return 0;
}
参考:为什么 cin 命令会在缓冲区中留下一个""?