与 C++ 中一行中的用户输入数组元素相关的问题



我正在编写一个非常基本的问题,但我被困在一行中读取数组的输入。我使用了如何在一行中用户在 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 命令会在缓冲区中留下一个""?

最新更新