在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

Posted

技术标签:

【中文标题】在 C++ 中的向量中键入所有值后出现分段错误(核心转储)【英文标题】:getting segmentation fault(core dump)after typing all the value in a vector in c++ 【发布时间】:2020-02-17 14:46:34 【问题描述】:

我已经制作了这段代码来打印一个字符串和整数。

 vector<int> nu;

for(int v;cin>>v;)
    nu.push_back(v);

vector<string> la;
for(string c;cin>>c;)
    la.push_back(c);

程序运行并开始取值,但是当我输入除 int 以外的任何东西来停止时

for(int v;cin>>v;)

部分我得到分段错误。所有变量都是在本地定义的,所以我不明白为什么会出现这个错误。

编辑:为了打印,我创建了一个函数

void print(vector<string> a,vector<int> b)
int y=0;
y= b.size();
for(int i=0;i<y;i++)
    cout<<a[i]<<" "<<b[i]<<"\n";
     


【问题讨论】:

您没有显示打印的代码。错误很可能在那里。为了获得帮助并避免您的问题被关闭,请提供一个可重现错误的小型可编译程序。 (通常在准备中发现错误...) 解决类似问题的一种典型结构化方法是将“数据获取”与“数据处理”分开。从处理开始。编写一个简单地获取数据(例如一个向量,或者可能是两个)并且不知道它来自哪里或如何填充的函数。使用硬编码一些向量的测试程序打印所有数据或其他数据(可能使用空向量作为测试用例......)。当您确定您的核心功能正常工作时,请处理输入机制。 另外,C++ 流输入也不够直观。例如,在读取 int 失败后,您的流可能处于错误状态,并且在您 clear() 之前不允许您输入任何其他内容。 请提供minimal reproducible example 你有两个向量 a 和 b 并且你运行一个循环 i 作为两个数组的索引。当 a 和 b 中的数组大小不同时可能会出现问题,并且您可能会尝试访问其边界之外的元素。 【参考方案1】:

在检查矢量大小之前,您不应访问矢量。您只检查向量b,但也访问向量a,这可能是空的,因为输入失败(因为您在输入无法解析为int的内容后没有清除流,所以第二个输入循环是从未进入)。

【讨论】:

谢谢。你是对的,流不清楚,因此我得到了分段错误,将 cin.clear();解决了问题【参考方案2】:

在循环中

for(int i=0;i<y;i++) 
    cout<<a[i]<<" "<<b[i]<<"\n";

如果其中一个索引是out_of _range,就会抛出一个out_of_range exception,因为你使用vectorb的大小来打印a,因为你是没有捕捉到这个异常,程序就会崩溃。

使用 foreach 循环来避免这种情况:

使用 foreach 循环来避免这种情况,例如:

vector<int> a;
for(int i : a)
  cout << a;

【讨论】:

【参考方案3】:

如果适合,你也可以试试这个:

void print(vector<string> a,vector<int> b)
int y=0;
y= b.size();

int x = a.size();

// min(x,y) is the minimum of x and y values
for(int i=0;i< min(x,y);i++)
    cout<<a[i]<<" "<<b[i]<<"\n";
     


【讨论】:

以上是关于在 C++ 中的向量中键入所有值后出现分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中比较来自向量的字符串时出现分段错误

在 C++ 索引程序中使用向量时出现分段错误 11

添加向量时出现分段错误。 (C++)

在 C++ 中使用向量的分段错误?

C ++中向量中的分段错误

堆内存中的 C++ 向量导致分段错误