为什么 "bad" 将 cin 用于数值变量?
Why is it "bad" to use cin for numeric variables?
我现在的教授在他的教学大纲中说:
"Never use cin >> to read directly into a numeric variable, like int or double or float. Read as a string (C or C++) and convert to a number using atoi or atof."
这有什么原因吗?起初我认为这是为了避免失败标志,但是如果您只是添加输入验证码,那么 "cin >> myInt"?
是不是很好
用他的方法,如果他们输入“4a5”,我输入了atoi,那不还是会报错吗?
谢谢~
总的来说,完全没有问题。这个建议似乎是错误的。
事实上,仅依靠 stoi
和朋友,您将失去 任何 控制转换过程的能力。您可能希望在某些非常特定于域的情况下使用它们,在这些情况下您想要提取特定数量的字符,然后 然后 尝试转换它们,但这取决于业务逻辑。
当然,依赖像 atoi
这样过时的代码会更糟,因为它的 未定义行为 会遇到许多失败案例。
这还不错,但不安全:如果流获取无效数据,它将以 "fail" 状态结束。这意味着程序员需要检查流是否仍在工作,然后处理数据。否则,重置流时失败后的所有内容都会丢失。
Getline 更适合这些情况,因为它的工作方式不同,它只会将所有输入作为字符串接受。
虽然这是有效代码...
int num;
cin >> num;
...如果用户输入一个不能被解释为int的字符,就会出现问题
这就是为什么将字符串变量与 cin 一起使用并以编程方式进行数据提取会更安全。
我现在的教授在他的教学大纲中说:
"Never use cin >> to read directly into a numeric variable, like int or double or float. Read as a string (C or C++) and convert to a number using atoi or atof."
这有什么原因吗?起初我认为这是为了避免失败标志,但是如果您只是添加输入验证码,那么 "cin >> myInt"?
是不是很好用他的方法,如果他们输入“4a5”,我输入了atoi,那不还是会报错吗?
谢谢~
总的来说,完全没有问题。这个建议似乎是错误的。
事实上,仅依靠 stoi
和朋友,您将失去 任何 控制转换过程的能力。您可能希望在某些非常特定于域的情况下使用它们,在这些情况下您想要提取特定数量的字符,然后 然后 尝试转换它们,但这取决于业务逻辑。
当然,依赖像 atoi
这样过时的代码会更糟,因为它的 未定义行为 会遇到许多失败案例。
这还不错,但不安全:如果流获取无效数据,它将以 "fail" 状态结束。这意味着程序员需要检查流是否仍在工作,然后处理数据。否则,重置流时失败后的所有内容都会丢失。
Getline 更适合这些情况,因为它的工作方式不同,它只会将所有输入作为字符串接受。
虽然这是有效代码...
int num;
cin >> num;
...如果用户输入一个不能被解释为int的字符,就会出现问题
这就是为什么将字符串变量与 cin 一起使用并以编程方式进行数据提取会更安全。