我必须从字符串中读取数字。这是一个安全且首选的
请指导我。
答案 0 :(得分:3)
我已经使用了所有这些,但不知道哪个更好。 然而,我确实找到了一篇不错的文章(here)关于最后两篇之间的利弊,值得一读
答案 1 :(得分:2)
绝对不是#1。 strstreams在C ++中已被弃用,并且在使用中存在很多问题。您想要替换它们 - 在<sstream>
中声明的字符串流类。这些是解决您问题的最佳通用解决方案 - 它们是类型安全且易于使用的。
答案 2 :(得分:2)
atoi / atof / strtol的功能
所有都有或多或少的麻烦和非明显的错误检查涉及errno
(strtol在任何情况下都比atoi好得多,所以避免使用atoi)。
有关讨论,请参阅theese answers。
我不太了解C ++,所以我不能评论istrstream。
答案 3 :(得分:1)
<强> Why use <iostream>
instead of <cstdio>
? 强>
提高类型安全性,减少错误,允许可扩展性并提供可继承性。
printf()可以说是没有被破坏,尽管容易出错,但scanf()可能是适合居住的,但两者都受限于C ++ I / O可以做什么。 C ++ I / O(使用&lt;&lt;&lt;&gt;&gt;)相对于C(使用printf()和scanf()):
更多类型安全:使用<iostream>
,
I / O的对象类型是已知的
由编译器静态编译。在
对比度,<cstdio>
使用“%”字段
动态计算出类型。
不易出错:使用<iostream>
,
没有多余的“%”代币
必须与...保持一致
实际对象是I / O。删除
冗余消除了一类错误。
可扩展:C ++ <iostream>
机制允许新的用户定义
类型是I / O而不会破坏
现有代码。想象一下混乱
每个人都在同时添加
新的不兼容的“%”字段
printf()
和scanf()
?!
可继承:
构建了C ++ <iostream>
机制
来自真正的课程,如
std :: ostream和std :: istream。不像
<cstdio>
的文件*,这些都是真实的
类,因此可继承。这个
意味着您可以拥有其他用户定义的
看起来和表现得像的东西
溪流,但这有什么奇怪的
和你想要的美好事物。您
自动使用数百万
用户编写的I / O代码行
你甚至不知道,他们不知道
需要知道你的“扩展
流“class。