说我有一个程序,它的整数。如果用户输入超出范围的数字或字母或其他东西,我该如何阻止程序崩溃?如何清洁cin?
如何清洁cin?
回答
的cin
的基类是std::basic_istream
。如果输入流无法从流中提取请求的数据,则表示发生可恢复错误。为了检查是否存在错误位,则必须使用std::basic_istream::fail()
方法 - 它返回true
如果有故障或false
如果一切正常。重要的是要记住,如果有错误,将数据留在流中,当然,错误位(S)也必须被清除使用std::basic_istream::clear()
是很重要的。另外,程序员必须忽略不正确的数据,否则尝试读取其他内容会再次失败。为此,可以使用std::basic_istream::ignore()
方法。至于有效的值范围,必须手动检查。好的,足够的理论,这里是一个简单的例子:
#include <limits>
#include <iostream>
int main()
{
int n = 0;
for (;;) {
std::cout << "Please enter a number from 1 to 10: " << std::flush;
std::cin >> n;
if (std::cin.fail()) {
std::cerr << "Sorry, I cannot read that. Please try again." << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
continue;
}
if (n < 1 || n > 10) {
std::cerr << "Sorry, the number is out of range." << std::endl;
continue;
}
std::cout << "You have entered " << n << ". Thank you!" << std::endl;
break;
}
}
希望它有帮助。祝你好运!
您可以检查读取是否成功的或不cin.good()
和cin.fail()
。
这样的事情应该做,你需要明确检查后藏汉缓冲区,如果我记得没错
if (cin.fail())
{
cout<<"need to put a number"<<endl;
cin.clear();
cin.ignore();
}
如果你不想库添加到您的代码,你也可以使用do..while()语句。 在你做,而你会要求用户输入,然后将其接收到的变量,然后你就可以检查这个,而部分如果不继续索要数据你期望的数据。
只是另一种选择....即使已经提到的答案应该工作比充分
我喜欢读取输入字符串形式多,然后与boost::lexical_cast<>
消毒他们:
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <string>
int main() {
std::string s;
while(std::cin >> s) {
try {
int i = boost::lexical_cast<int>(s);
std::cout << "You entered: " << i << "\n";
} catch(const std::bad_cast&) {
std::cout << "Ignoring non-number: " << s << "\n";
}
}
}
后记:如果您对Boost过敏,可以使用lexical_cast的这个实现:
template <class T, class U>
T lexical_cast(const U& u) {
T t;
std::stringstream s;
s << u;
s >> t;
if(!s)
throw std::bad_cast();
if(s.get() != std::stringstream::traits_type::eof())
throw std::bad_cast();
return t;
}
捕获所有子句w/o重新抛出是否定的。 – 2012-11-08 03:24:27
你能解释一下,还是提供引用? –
@VladLazarenko:固定。 –
您可以使用有效输入的简单和快速的检查将下面的代码INT:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int intb;
while(!(cin>>intb)){
cin.clear();
cin.ignore (1000, '\n');
cout<<"Invalid input enter again: "<<endl;
}
cout<<"The value of integer entered is "<<b<<endl;
return 0;
}
while循环不断迭代,直到它得到正确的输入。 cin.clear()更改错误控制状态。 cin.ignore()清除输入流,以便再次输入新的输入。如果不这样做,while循环将处于无限状态。
- 1. 如何清洁sys.conversation_endpoints
- 2. 如何清洁register_shutdown_function
- 3. 如何“清洁石板”?
- 4. 如何强制Maven清洁?
- 5. 如何清洁rss描述
- 6. 如何清洁在PHP
- 7. 如何清洁gwt CellList?
- 8. 如何清洁中的R
- 9. 如何清洁Magento的头
- 10. Libgdx - 如何清洁颜色?
- 11. 如何深度清洁Xcode?
- 12. 如何清除cin的缓冲区?
- 13. 整洁,清洁访问SKNodes
- 14. 清除CIN在C++
- 15. 如何使Android的一个假的清洁程序,看起来像清洁大师或其他清洁应用
- 16. 清洁工程
- 17. CSS清洁器
- 18. 清洁RandomAccessFile的
- 19. [R串清洁
- 20. Grails的清洁
- 21. 清洁ArrayCollections
- 22. 清洁值
- 23. 清洁网址
- 24. 清洁django user.username
- 25. 清洁jQuery如果语句
- 26. 如何保持会话清洁?
- 27. maven如何清洁测试源?
- 28. flywaydb:如何停止意外清洁
- 29. 如何做好清洁和使用Ant
- 30. 如何完全清洁select2控件?
http://www.parashift.com/c++-faq/istream-and-ignore.html – chris