cin N元素到向量C ++

时间:2015-01-21 22:56:36

标签: c++

所以我试图让用户提供两个向量的元素,但使用while (cin >> ..)会导致程序崩溃。以下是我到目前为止的情况:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    size_t size = 4; int i;
    vector<int> product;

    vector<int> v1;
    vector<int> v2;

    int input, input2;

    cout << "Enter values for first vector: ";
    while (cin >> input) {
        v1.push_back(input);
    }
    cout << "Enter values for second vector: ";
    while (cin >> input2) {
        v2.push_back(input2);
    }

    int result = 0;
    if (size >= 1) {
        result += v1[0]*v2[0];
        for (int i = 1; i < size; ++i)
            result -= v1[i]*v2[i];
    }

    cout << result << endl;

    return 0;
}

用户必须为第一个向量输入N个元素,为第二个向量输入另外N个元素。但是,我不能跳过阅读直到EOF的用法,因为我不知道用户想要在每个向量中存储多少元素。

3 个答案:

答案 0 :(得分:3)

你的程序崩溃了,因为它错误地假设向量是非空的。

想象一下,第一个向量有三个元素,用户为第二个元素输入零元素。没有什么可以阻止您的代码执行result += v1[0]*v2[0];,后者访问v2的第一个元素。

所以在其他任何事情之前你应该检查空矢量的检查。


  

但是,我不能跳过阅读的使用直到EOF

我不认为它是由标准保证的,它可能取决于平台,但有趣的是我相信你实际上有时可以从stdin读取直到EOF,然后重新打开或清除输入错误,然后继续阅读更多输入直到(第二个)EOF。我不会推荐它。

有更好的解决方案。您可以要求用户在其自己的行上输入每个向量,因此您知道在到达行尾时已完成输入一个向量的元素,或者您可以要求用户告诉您它们有多少元素进入,然后阅读那么多元素。

我相信你可以自己实施后一个建议。这是前者的简单实现。

#include <sstream> // for istringstream
#include <string>  // for string and getline()
#include <vector>

int main() {
  vector<int> v;

  string line;
  if (getline(cin, line)) {
    istringstream is(line);
    int i;
    while (is >> i) {
      v.push_back(i);
    }
  }

}

基本上,我们从用户的输入中读取一行,然后我们从这一行创建另一个流,并处理从该流中读取整数,就像您直接从用户的输入处理它们一样。

答案 1 :(得分:1)

您是否希望用户输入要输入的元素数量?

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    size_t size; int i;
    vector<int> product;

    vector<int> v1;
    vector<int> v2;

    int input, input2;

    cout << "Enter vector size: ";
    cin >> size;

    cout << "Enter values for first vector: " << endl;
    i = 0;
    while (i++ != size) {
        cin >> input;
        v1.push_back(input);
    }   
    cout << "Enter values for second vector: " << endl;
    i = 0;
    while (i++ != size) {
        cin >> input2;
        v2.push_back(input2);
    }

    int result = 0;
    if (size >= 1) {
        result += v1[0] * v2[0];
        for (int i = 1; i < size; ++i)
            result -= v1[i] * v2[i];
    }

    cout << result << endl;

    system("pause");
    return 0;
}

答案 2 :(得分:0)

在加载第二个向量之前,您需要清除错误状态和来自cin的任何错误数据。

std::vector<int> loadValues() {
  std::vector<int> v;
  int input;
  while (std::cin >> input)
    v.push_back(input);

  std::cin.clear();
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  return v;
}

然后,正如其他人指出的那样,你需要在使用之前检查两个向量的大小。

Live demo