可能是重复问题:
我应该在我的C++代码中使用printf吗?
如果我只想在屏幕上打印一个字符串,我可以使用以下两种方式:
printf("abc");
std::cout << "abc" << std::endl;
那么,在上面展示的例子中,使用printf
优于std::cout
还是反过来更有优势呢?
可能是重复问题:
我应该在我的C++代码中使用printf吗?
如果我只想在屏幕上打印一个字符串,我可以使用以下两种方式:
printf("abc");
std::cout << "abc" << std::endl;
那么,在上面展示的例子中,使用printf
优于std::cout
还是反过来更有优势呢?
std::cout
版本清晰地展示了每个步骤正在执行的操作。相比之下,printf
则使用了难以理解的格式化字符串。 - Zac Howlandcout
的方式是:cout << person << '\n'
。这是一个常见的误解。 - Sebastian Machendl
应该只在想要刷新流时使用。 - Cerranprintf
及其相关函数是C语言的函数。它们在C++中可以工作,但不具有C++ std::ostream
的类型安全性。使用printf
函数基于用户输入(甚至是来自文件的输入)格式化输出的程序可能会出现问题。例如:
int main()
{
char[] a = {'1', '2', '3', '4'}; // a string that isn't 0-terminated
int i = 50;
printf("%s", a); // will continue printing characters until a 0 is found in memory
printf("%s", i); // will attempt to print a string, but this is actually an integer
}
C++具有更强的类型安全性,还有一个std::string
类,可以帮助防止这些问题。
char* a = "1234";
,那么就会有一个终止符号。但是,当你没有终止符号时,我正在演示的问题就会出现。 - Zac Howlandstd::string
而不是 const char *
,那么你不会在使用cout
时遇到问题,但在使用printf( "%s\n", st.c_str() );
时也不会有问题。我同意你的答案,但类型安全问题随着时间的推移而变得模糊了...... gcc将通过解析调用处的格式字符串来验证类型正确性,并提供编译器警告。这不是标准要求的,但它确实存在。 - David Rodríguez - dribeasputs
还是 cout
”。我正在搜索以尝试找出谁在内部调用谁,puts()
中是否有一个 cout
调用? - LoneXcoderprintf
是从C语言中借用的,有一些局限性。最常见的限制是类型安全性,因为它依赖于程序员正确匹配格式字符串和参数。第二个限制来自于可变参数环境,即无法使用用户定义的类型扩展行为。printf
知道如何打印一组类型,这就是你可以得到的全部内容。尽管如此,对于可以使用printf
处理的少数事情而言,与c++流相比,使用printf
更快且更简单。std::cout
打印相同数组的情况下。type
的std::ostream& operator<<( std::ostream&, type const & )
,流(包括std::cout
)可以扩展以处理用户定义类型。它们本身是类型安全的——如果传入一个没有重载operator<<
的类型,编译器将会报错。然而,它们更加繁琐以产生格式化输出。operator<<
很简单,并且可以统一地与所有类型一起使用。这两个例子做的事情不同。后者会添加一个换行符并刷新输出(std::endl
的结果)。std::cout
也比较慢。除此之外,printf
和 std::cout
实现了相同的功能,你可以选择任何一个。就个人而言,在 C++ 代码中我会使用 std::cout
。它更易读且更安全。
如果您需要使用 std::cout
格式化输出,请参阅this article。
sync_with_stdio(false)
,那么输出流与printf函数一样快。 - Sebastian Machprintf
中的明显错误,比如 printf("%s", int());
。此外,许多自定义类型被重载以与 iostreams 一起使用,但你永远无法使用 printf
打印自定义类型。cout
也提供格式化功能。@Charles:我个人没有。我知道 iostream
以非常慢的速度运行而闻名,当我测试它时,与 printf
相比,它非常慢。 - Puppyprintf
才更快。 - Sebastian Mach