为什么 std::cin.clear() 在这个简单的程序中不起作用?
Why doesn't std::cin.clear() work in this simple program?
我在做一些练习来打发时间,遇到了一个我不明白的行为,我来解释一下:
练习:
Write a program that reads and stores a series of integers and then computes the sum of the first N
integers. First, ask for N
, then read the values into a vector, then calculate the sum of the first N
values.
因为我要求 N
作为第二步:
第二个std::cin
(std::cin >> values_to_compute
)必须离开while语句才能继续程序,"only possible if"读取的不是double。例如,我可以打字; 'k' 或 "how are you?" 或 Ctrl + Z(我在 Windows 10)。
int main() {
try {
double holder {0};
std::vector<double> values;
while (std::cin >> holder) {
values.push_back(holder);
}
std::cin.clear();
std::cout << "Out of the loop, now entering to the other std::cin\n";
int values_to_compute {0};
std::cin >> values_to_compute;
std::cout << "Computing...\n";
double result_computed {0};
for (int i {0}; i < values_to_compute; ++i) {
result_computed += values[i];
}
std::cout << "Result computed " << result_computed << '\n';
system("pause");
return 0;
}
catch (std::runtime_error& e) {
std::cerr << e.what() << '\n';
system("pause");
return 1;
}
}
好吗?
所以... std::cin
让 while 处于不好的状态。我必须调用 std::cin.clear()
才能再次使用 std::cin
。
好的,然后呢?
好吧,如果我输入 Ctrl+Z 退出 while
循环,std::cin.clear()
会起作用;如果我键入的内容不是 Ctrl + Z,则 std::cin.clear()
不起作用。
我想知道这种行为的原因。
那是因为 std::cin::clear
清除了 cin
的错误状态,但它 没有 从流中删除数据。在阅读values_to_compute
.
之前,您可以使用std::cin::ignore()
阅读并丢弃一行文本
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
确保 #include <limits>
获得 std::numeric_limits
。
我在做一些练习来打发时间,遇到了一个我不明白的行为,我来解释一下:
练习:
Write a program that reads and stores a series of integers and then computes the sum of the first
N
integers. First, ask forN
, then read the values into a vector, then calculate the sum of the firstN
values.
因为我要求 N
作为第二步:
第二个std::cin
(std::cin >> values_to_compute
)必须离开while语句才能继续程序,"only possible if"读取的不是double。例如,我可以打字; 'k' 或 "how are you?" 或 Ctrl + Z(我在 Windows 10)。
int main() {
try {
double holder {0};
std::vector<double> values;
while (std::cin >> holder) {
values.push_back(holder);
}
std::cin.clear();
std::cout << "Out of the loop, now entering to the other std::cin\n";
int values_to_compute {0};
std::cin >> values_to_compute;
std::cout << "Computing...\n";
double result_computed {0};
for (int i {0}; i < values_to_compute; ++i) {
result_computed += values[i];
}
std::cout << "Result computed " << result_computed << '\n';
system("pause");
return 0;
}
catch (std::runtime_error& e) {
std::cerr << e.what() << '\n';
system("pause");
return 1;
}
}
好吗?
所以... std::cin
让 while 处于不好的状态。我必须调用 std::cin.clear()
才能再次使用 std::cin
。
好的,然后呢?
好吧,如果我输入 Ctrl+Z 退出 while
循环,std::cin.clear()
会起作用;如果我键入的内容不是 Ctrl + Z,则 std::cin.clear()
不起作用。
我想知道这种行为的原因。
那是因为 std::cin::clear
清除了 cin
的错误状态,但它 没有 从流中删除数据。在阅读values_to_compute
.
std::cin::ignore()
阅读并丢弃一行文本
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
确保 #include <limits>
获得 std::numeric_limits
。