更喜欢使用istrstream或strtol / strtod来读取字符串中的数字

时间:2010-03-17 10:00:56

标签: c++

我必须从字符串中读取数字。这是一个安全且首选的

  1. istrstream
  2. atoi / atof
  3. 与strtol / strto
  4. 请指导我。

4 个答案:

答案 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。