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 读取该行的其余部分(这是一个空字符串)。之后,您尝试将该行中的所有数字读入向量(没有数字被读取,因为它是一个空字符串),然后您尝试读取向量中的第一个数字(这会出错,因为没有添加数字)。