向量中的字符串交集给出分段错误

Posted

技术标签:

【中文标题】向量中的字符串交集给出分段错误【英文标题】:string intersection in vectors giving segmentation fault 【发布时间】:2018-09-17 13:39:31 【问题描述】:

如果至少一个字符在 C++ 中的字符串向量中是常见的,我已经编写了程序来求和,因为我使用了 set_intersection 函数。我得到分段错误,不知道为什么。

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int matching_characters(string s1, string s2);

int main()

    string s;
    vector<string> ss;
    int n,sum=0,avg=0;
    cout<<"enter no in group"<<endl;
    cin>>n;
    for(int i=1;i<=n;i++)
    
        cin >> s;
        ss.push_back(s);

    
   // cout<<ss[1];

 // cout<<ts[1];
 for(int i=1;i<=n;i++)
 

    for(int j=1;j<=n;j++)
    
     if(i==j)
     continue;
    int t=matching_characters(ss[i], ss[j]);
    cout<<t;
    if(t!=0)
     sum=sum+1; 
    
 

    cout<<"'s='"<<sum<<endl;
    //avg=sum/n;
    //cout<<avg;
     return 0;


int matching_characters(string s1, string s2) 
  sort(s1.begin(), s1.end());
  sort(s2.begin(), s2.end());
  string intersection;
  set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
                        back_inserter(intersection));
  return intersection.size();

【问题讨论】:

请将您的代码作为文本发布在您的问题中。 for(int i=1;i&lt;=n;i++) 索引从 0 开始。试试for(int i = 0; i &lt; n; i++) 当使用vector 时,您可以使用at 而不是[]。这将引发错误索引的异常。 【参考方案1】:

我认为

for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)
    
        if(i==j)
            continue;

最好写成

for(int i=0;i<n;i++)

    for(int j=i+1;j<n;j++)
    

考虑到n 对象数组具有有效索引[0]...[n-1],我们在第一个循环中从0 开始,并在到达无效索引n 之前停止迭代。为了提高效率,我们在跳过一半以上比较的点开始第二个循环。 (A和A比较没有意义,A和B比较之后,B和A比较也没有意义。)

【讨论】:

以上是关于向量中的字符串交集给出分段错误的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

带有向量和字符串的 C++ 分段错误

分段错误:核心转储 C++ 向量对字符串:

C++ 向量和分段错误