【问题标题】:cin N elements to vector C++ [duplicate]cin N元素到向量C++ [重复]
【发布时间】:2015-01-21 22:56:35
【问题描述】:

所以我试图让用户提供两个向量的元素,但使用 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 的用法,因为我不知道用户想要在每个向量中存储多少元素。

【问题讨论】:

  • 那么你的问题将如何计算第二个向量的开始?
  • @P0W,当我第一次输入后 Ctrl+Z 时?
  • 不是重复的。那里的建议对我不起作用。
  • 那么有人可以帮忙吗?或者我应该接受Another poor soul 评论吗?

标签: c++


【解决方案1】:

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

假设第一个向量包含三个元素,而用户为第二个向量输入零个元素。没有什么可以阻止您的代码执行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);
    }
  }

}

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

【讨论】:

    【解决方案2】:

    不希望用户输入要输入的元素个数吗?

    #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;
    }
    

    【讨论】:

    • 如果用户输入负尺寸,这段代码会发生什么?或者如果他们输入“asdf”而不是数字?始终验证所有用户输入。
    • 并且不要使用system("pause"); 在 Windows 上运行程序时查看输出 1) 如果使用 Visual Studio 2) 如果要运行调试,请在不调试的情况下运行 (ctrl-f5),在输出之后和程序退出之前放置一个断点,或者 3) 按照these 的说明使用cmd.exe /k "%1" %* 命令创建一个名为“在 cmd.exe 窗口中打开”的资源管理器右键单击命令。
    • 代码的重点是指出缺少的内容。不要创建防崩溃程序。
    • 好吧,我觉得用文字来描述会更好;您可以更具体地了解对代码的哪些更改是相关的以及它们是相关的。此外,看起来有效的示例代码可能会被假定为完全有效且正确。
    【解决方案3】:

    在加载第二个向量之前,您需要清除 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2014-11-21
      • 2018-12-03
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      相关资源
      最近更新 更多