在 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
,因为你使用vector
b
的大小来打印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++ 中的向量中键入所有值后出现分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章