当用户输入“回车”键时停止

时间:2017-04-09 06:17:49

标签: c++ string vector segmentation-fault

我一直在编写一个程序,它从两个不同的“向量”中获取用户的输入,并在输入键被击中时停止。代码如下:

 #include <iostream>
 #include <vector>
 #include <string>

using namespace std;

int main()
{
    vector<string> a,c;
    string b;
    int m=0;//,words = 0;
    do
    {
        cin>>a[m];
        m++;
    }
    while(cin.get()!= '\n');

    int n=0;
    do
    {
        cin>>c[n];
        n++;
    }
    while(cin.get() != '\n');

    int mida=a.size()/2, midc=c.size()/2;
    int count;
    int i,j;

    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            {
                if(a[i] == c[j])
                count++;
            }

    if(count >= mida  || count >= midc)
        cout<<"similar"<<endl;
    else
        cout<<"dissimilar"<<endl;
    return 0;
}

现在的问题是,当我在输入单词之后运行代码时,我需要将这些单词放入向量中,例如'mango''orange'用空格分隔,但是 一旦我点击进入,我就会出现分段错误。有谁能告诉我什么可能出错。

2 个答案:

答案 0 :(得分:1)

创建std::vector对象时,它开始为空,其size将为零,并且其中的所有索引都将超出界限并导致未定义的行为(和可能的崩溃)。

您可以使用push_back将元素附加到矢量。像

std::string s;
std::cin >> s;
a.push_back(s);

虽然以上是您遇到崩溃的最可能原因,但这不是您唯一的问题。另一个是每个输入字符串可能以换行符结束。如果你想读一整行,然后把它分成&#34;单词&#34;然后我建议您使用std::getline来读取整行,然后使用std::istringstream从该行中获取单独的单词。

您还可以使用std::istream_iterator轻松append从输入流到矢量的字符串。

您可以执行类似

的操作
std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);

a = std::vector<std::string>(std::istream_iterator<std::string>(iss),
                std::string>(std::istream_iterator<std::string>());

答案 1 :(得分:0)

a

您正在索引向量a[0]的末尾。因为向量没有给出大小,所以它没有空间来分配偶数a.push_back[input]

可能的做法是使用临时变量来获取用户输入,然后使用{{1}}。