【问题标题】:Why we do not use Printf and Scanf in C++? [duplicate]为什么我们不在 C++ 中使用 Printf 和 Scanf? [复制]
【发布时间】:2010-12-23 04:32:06
【问题描述】:

可能重复:
Which I/O library do you use in your C++ code?

在 C++ 中我们为什么选择 COUT 和 CIN

【问题讨论】:

  • 我们会,只是不要告诉任何人...... :)
  • @Er.Priyank 请允许我欢迎您加入 Stack Oveflow 并记住我们通常在这里做的三件事:1) 当您收到帮助时,也尝试给予帮助 回答问题 在您的专业领域内 2) 阅读常见问题解答! 3) 当您看到好的问题和答案时,使用灰色三角形为它们投票,作为系统基于用户通过分享他们的知识而获得的声誉。还记得接受更好地解决您的问题的答案,如果有的话,按复选标记
  • 而且,事实上,即使在 C 中使用 scanf 通常也是个坏主意,除非您完全控制输入。

标签: c++


【解决方案1】:

因为类可以重载插入操作符

他们无法编辑 printf 并添加 %Foo 以了解如何打印 Foo 类。

【讨论】:

  • 我喜欢你回答的第二部分。聪明的! :)
  • 这也意味着你不能搞砸!编译器要么找出要调用的运算符
【解决方案2】:

你可以使用它们。

但主要问题是它们不安全。
很多 C 代码存在问题,因为格式说明符与参数不匹配,导致崩溃等。

// Example
char c;
scanf("%s",&c);  // quite an easy mistake. Usually leads to a crash or something worse.

C++ 变体是类型安全的(因为编译器保证您输入的类型在编译时是正确的类型)并且运行时执行实际移动数据的工作。

第二个原因是在 C++ 中定义输出函数(运算符 >> 和

第三个优点是流不限于控制台或文件。还有几种其他类型的流可以自动与运算符 >> 和 streaming(或序列化)。

【讨论】:

    【解决方案3】:

    除了能够为您选择的类重载插入和提取运算符之外,cincout 是类型安全的,而 scanfprintf 不是 - 例如,转换之间的不匹配printf 的格式和实际类型相当普遍:

    printf("%d\n", 1.0);
    printf("%f\n", 1);
    

    这些都不可能产生有用的输出。

    【讨论】:

      【解决方案4】:

      旧的stdio 功能在 C++ 中是为了兼容(部分原因是原始的 C++ (cfront) 只是 C 的预处理器,因此它们仍然可用)。

      在 C++ 中发现的较新的 I/O 模型更加灵活,允许您随意添加类型,可以以该类型定义的方式打印。

      换句话说,以面向对象的方式。

      就像复数或有理数一样,数字(或地址簿条目或字典条目或任何其他非基本类型)应该自包含在一个类中,该类知道如何将它们与基础语言,这些对象的打印也应该留给类。

      如果您担心 C++ 方式的冗长,没有什么能阻止您向自己的数据类型添加 fmt() 方法、返回字符串以解决该问题,例如:

      std::cout << name.fmt('left',15)   // [Pax Diablo     ]
                << " " << age.fmt(4)     // [  45]
                << " " << score.fmt(3,2) // [100.00]
                << std::endl;
      

      尺寸和/或理由。

      你在课堂上的编码更多,但如果你真的不喜欢 setfillsetw 的东西,它一个选项。

      但是,由于您几乎可以肯定将格式化代码放在每种输出类型的函数中(如果您很聪明的话),它将被隔离在一个区域中。我只是接受它并学习 C++ 做事的方式。

      【讨论】:

        【解决方案5】:

        C++ 语法应该更简单,但坦率地说,我从未采用过它。此外,我做的是 Windows 编程,而不是控制台,所以 cout 或 printf 都没有多大用处。但是 sprintf 和它的变种是。

        【讨论】:

        • 也许您可能想查看 other 流输出函数 (cppreference.com/wiki/io/sstream/start)。这样,您将获得更强大、可扩展的 sprintf,并且没有人可以称您为 luddite。来吧,加入我们:-)
        • 我作为一名开发人员已经足够长的时间知道我喜欢使用什么,不喜欢什么。
        猜你喜欢
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 2014-02-04
        • 2011-05-03
        • 1970-01-01
        • 2019-02-16
        • 2015-03-29
        相关资源
        最近更新 更多