#include <iostream>
int main() {
int arr[4];
for(int I = 0; I != 4; ++i) {
std::cin >> arr[i];
if(std::cin.fail()) {
std::cin.clear();
--i;
break;
}
}
for (auto u : arr)
std::cout << u << '\n';
}
我不明白为什么这段代码不起作用。如果std::cin
返回true,我希望再次arr
std::cin.fail()
的元素。
答案 0 :(得分:0)
break
将终止循环。那不是你想要的。
另请注意,您不会从流中删除有问题的字符,因此您的下一个问题将是无限循环。
但是,即使删除有问题的字符,也可能会进入无限循环,因为输入流中可能根本没有四个有效整数。
这是一个只在循环中更新i
的解决方案。
#include <iostream>
#include <cstdlib>
int main()
{
int arr[4];
for(int i = 0; i != 4; /* this field intentionally left empty */)
{
std::cin >> arr[i];
if(std::cin) // did the read succeed?
{
++i; // then read the next value
}
else
{
if (std::cin.eof()) // if we've hit EOF, no integers can follow
{
std::cerr << "Sorry, could not read four integer values.\n";
return EXIT_FAILURE; // give up
}
std::cin.clear();
std::cin.ignore(); // otherwise ignore the next character and retry
}
}
for (auto u : arr)
std::cout << u << '\n';
}
但是整个事情变得脆弱,输入的解释可能与用户的意图不同。如果遇到无效输入,最好放弃:
#include <iostream>
#include <cstdlib>
int main()
{
int arr[4];
for (auto& u: arr)
std::cin >> u;
if (!std::cin) // Did reading the four values fail?
{
std::cerr << "Sorry, could not read four integer values.\n";
return EXIT_FAILURE;
}
for (auto u: arr)
std::cout << u << "\n";
}