所以我试图让用户提供两个向量的元素,但使用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的用法,因为我不知道用户想要在每个向量中存储多少元素。
答案 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;
}
然后,正如其他人指出的那样,你需要在使用之前检查两个向量的大小。