我正在尝试构建一个程序,要求用户将数字输入到向量中,并将这些数字显示到控制台。每次我输入数字时,程序都不会停止运行,除非我输入逗号。我该如何解决这个问题?
这是我的代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int series_of_numbers;
vector<int> seriesVector;
cout << "Enter a series of numbers ending with 0, separated by space." << endl;
while (cin >> series_of_numbers) {
seriesVector.push_back(series_of_numbers);
}
for (int i = 0; i < seriesVector.size(); ++i) {
cout << seriesVector[i] << " ";
}
return 0;
}
您的程序将继续读取值,直到出现流错误,或者您的向量抛出
std::bad_alloc
并且进程终止。
当您在输入中添加逗号时,可能会导致流错误(取决于系统区域设置),因为您尝试将格式化输入写入
double
值。在美国语言环境中,逗号对于双精度型中的任何字符都无效。在某些欧洲语言环境中,它是小数点分隔符,因此在某些情况下逗号也不会停止您的程序。
问题在于程序不知道您打算输入多少个值,因此如果可能的话它会很高兴地继续等待更多值。在许多终端中,您可以通过按 Ctrl-D(有时按 Enter)来结束输入。
您的实际提示是:
输入一系列以 0 结尾的数字,以空格分隔。
您的循环没有强制执行这些约束中的任何一个。现在,它将允许任意数量的空格(包括换行符),并且不会检查哨兵值 0 来结束输入。
所以你可以选择如何处理它。这将读取值,直到流错误或读取零:
double val;
while (cin >> val && val != 0) {
seriesVector.push_back(val);
}
或者,您可以读取单行输入,然后从中读取以空格分隔的 double
值。这种方法不需要特殊的零值来表示结束。您可以简单地解析该行中的所有值:
string line;
if (getline(cin, line)) {
istringstream iss(line);
double val;
while (line >> val) {
seriesVector.push_back(val);
}
}