有没有printf的替代品?

时间:2019-06-05 05:13:41

标签: c++ printf

如果您printf,则可以访问

#include <stdio.h>。由于格式说明符,我喜欢使用printf,而且感觉比做std::cout << "something\n";更好。

#include <stdio.h>
#include <cstdlib> // to use rand()

int main() {
    int randNum = rand()%10 + 1;
    printf("Hey, we got %d!\n", randNum);
    return 0;
}

vs

#include <iostream>
#include <cstdlib> // to use rand()
using std::cout;

int main() {
    int randNum = rand()%10 + 1;
    cout << "Hey, we got " << randNum << "!\n";
    return 0;
}

但是我所在的不和谐服务器上的用户说这是不正确的做法,因为“ printf不安全,请使用std :: cout”。

第二位用户说这很不好,因为它不是类型安全的(第一位用户确实提到了类型安全,但没有深入探讨)。

第二个用户说,

  

Typesafety由编译器强制执行。但是,通过使用可变参数函数,编译器无法在运行时告诉参数的类型;它无法提前知道他们。该函数需要某种方式来说明期望的参数类型,而printf C函数家族通过格式字符串说明符完成了此操作。

所以我正在寻找其他选择。

如果没有,我想我会坚持std::cout

2 个答案:

答案 0 :(得分:5)

GNU C ++编译器g++在编译时检查printf参数。如果在命令行上指定-Wall,则它会在检测到不匹配时发出警告。因此,如果您使用的是此编译器,则可以使用printf而不用担心。

您的编译器可能会或可能不会提供类似的服务。但是,无论如何,至少应使用printf,至少要优先于荒谬的cout机制。或者,对于类型安全的解决方案,您可以考虑使用Boost Format library

编辑后添加: This question进行了一个您可能会感兴趣的讨论。

答案 1 :(得分:-3)

正如@TonyK所解释的那样,snprintfsprintf用于写入缓冲区而不是标准流。这不只是回答特定问题,而是解释了更广泛的解决方案。


要获得“更安全”的功能,可以使用snprintf,其中明确指定了对象的大小。

在不指定大小且未使用printf的情况下,您必须“相信”所提供的char*是有效的C字符串,其终止符为空字符,否则printf将继续读取记忆。


通常来说,如果要求仅使用C且仅对关联的C运行时库(Linux上的glibc,Windows上的msvcrt / ucrt等)具有依赖性,则仅使用C标头并使用C编译器很有意义。

如果可以选择使用C ++,那么使用std::cout是自然的选择,因为它将支持显示实现ostream::operator<<的任何对象。

最佳选择的答案将取决于您尝试实现的目标。