c++中一行用户输入数组元素的相关问题
Issues related to user input array elements in one line in 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
另外我想知道如果读入一个字符串后如果它们之间存在 space 如何分开它们?
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;
}
参考:
让我们看看您输入的带有显式换行符的情况:
4\n
1 3 4\n
1 10 100\n
21 88 17\n
23 34 45\n
在 cin >> n
之后,剩余的未读输入将如下所示:
\n
1 3 4\n
1 10 100\n
21 88 17\n
23 34 45\n
在第一个 getline
之后,它看起来像这样:
1 3 4\n
1 10 100\n
21 88 17\n
23 34 45\n
看到问题了吗?第一次从 cin
中读取值时,该行未完全读取,随后的 getline
读取该行的其余部分(这是一个空字符串)。之后,您尝试将该行中的所有数字读入向量(没有数字被读取,因为它是一个空字符串),然后您尝试读取向量中的第一个数字(这会出错,因为没有添加数字)。
我正在编写一个非常基本的问题,但我一直在读取一行数组的输入。我使用了
#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
另外我想知道如果读入一个字符串后如果它们之间存在 space 如何分开它们?
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;
}
参考:
让我们看看您输入的带有显式换行符的情况:
4\n
1 3 4\n
1 10 100\n
21 88 17\n
23 34 45\n
在 cin >> n
之后,剩余的未读输入将如下所示:
\n
1 3 4\n
1 10 100\n
21 88 17\n
23 34 45\n
在第一个 getline
之后,它看起来像这样:
1 3 4\n
1 10 100\n
21 88 17\n
23 34 45\n
看到问题了吗?第一次从 cin
中读取值时,该行未完全读取,随后的 getline
读取该行的其余部分(这是一个空字符串)。之后,您尝试将该行中的所有数字读入向量(没有数字被读取,因为它是一个空字符串),然后您尝试读取向量中的第一个数字(这会出错,因为没有添加数字)。