为什么对数值变量使用 cin "bad"?
Why is it "bad" to use cin for numeric variables?
我现在的教授在他的教学大纲上说:
"永远不要使用 cin>>直接读取数值变量,如 int、double 或 float。读取为字符串(C 或 C++),并使用 atoi 或 atof 转换为数字。
这有什么原因吗?起初我以为这是为了避免失败标志,但如果您只是添加输入验证代码,"cin>> myInt"不是可以吗?
使用他的方法,如果他们输入"4a5"并且我做了 atoi 它是否仍然会抛出错误?
谢谢~
总的来说,它根本没有错。这个建议似乎是错误的。
事实上,仅仅依靠stoi
和朋友,你就失去了控制转换过程的任何能力。您可能希望在一些非常特定于域的情况下使用这些字符,在这些情况下,您希望提取特定数量的字符,然后尝试转换它们,但这取决于业务逻辑。
当然,依赖像atoi
这样的过时代码更糟糕,因为它在遇到许多故障案例时具有未定义的行为。
这还不错,但它不安全:如果流获得无效数据,它将最终处于"失败"状态。这意味着程序员需要检查流是否仍在工作,然后处理数据。否则,重置流时,失败后的所有内容都将丢失。
Getline 更适合这些情况,因为它的工作方式不同,它只会接受所有输入作为字符串。
虽然这是有效的代码...
int num;
cin >> num;
。如果用户输入的字符无法解释为 int,则会出现问题。
这就是为什么将字符串变量与 cin 一起使用并以编程方式进行数据提取更安全的原因。
相关文章:
- C++中的cin.ignore()函数不适用于整个流
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- Problems with std::cin.fail()
- 由cin中的字符串中未捕获空白引起的分割错误
- 在C++中使用Cin,我如何在1行中输入
- 将 cin 限制为只有一个
- cin >> int 给定一个字符串将 int 赋值为 0
- istream std::cin如何修改自定义istream缓冲区
- C++ 将 CIN 值存储到任何类型的数组中
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- cin 的十进制输入验证?
- Turbo C++ cin() 不能与 gets() 一起使用
- 使用 cin 时接受小数点后的 2 位数字
- 在 std::getline 和 std::cin 期间卡在循环中
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- 为什么我的两个 cin 语句没有在程序结束时运行?
- C++ cin.ignore() 跳过循环
- CIN是逻辑1还是0?
- 为什么对数值变量使用 cin "bad"?
- What is Scala for: getline(), std::cin.eof(), std::cin.bad()