printf与std :: cout

13 c++ printf cout

可能重复:
我应该在我的C++代码中使用printf吗?

如果我只想string在屏幕上打印,我可以使用以下两种方式:

printf("abc");

std::cout << "abc" << std::endl;
Run Code Online (Sandbox Code Playgroud)

案例是,并且在上面显示的例子中,有使用printf结束的优点std::cout,反之亦然?

dan*_*n78 31

虽然cout是正确的C++方式,但我相信有些人和公司(包括Google)继续printf在C++代码中使用,因为使用格式化输出printf比使用格式化输出要容易得多cout.

这是我在这里找到的一个有趣的例子.

相比:

printf( "%-20s %-20s %5s\n" , "Name" , "Surname" , "Id" );
Run Code Online (Sandbox Code Playgroud)

cout << setw( -20 ) << "Name" << setw( 20 ) << "Surname"  << setw( 5 ) << "Id" << endl;
Run Code Online (Sandbox Code Playgroud)

  • 一个示例显示较小的代码行并不总是意味着更具可读性.`std :: cout`版本明确说明了它在每一步中的作用.`printf`有一个神秘的格式化字符串. (4认同)
  • +1,你已经说明了printf的一个优点,所以看起来像是一个有效的答案. (3认同)
  • 这是事实,但是一旦你习惯了它,可以说printf更容易使用这两者.就个人而言,我总是发现流格式非常笨重. (2认同)
  • 也应仅在要刷新流时使用`endl`。 (2认同)

Zac*_*and 17

printf及其相关的朋友是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
}
Run Code Online (Sandbox Code Playgroud)

C++具有更强大的类型安全性(和std::string类),以帮助防止这些问题.

  • @ aali他定义了一个字符数组,那些恰好能够被解释为C语言中的字符串,它不会自动在数组的末尾添加一个零字节. (3认同)
  • @aali:不,你不会自动添加终结器.如果我把它声明为`char*a ="1234";`那就有一个,但是当你没有终结器时,我所展示的问题就出现了. (3认同)
  • @Zac,我认为@CashCow试图说的是,在这种特殊情况下,它在两种情况下完全相同.如果你把自己限制在`std :: string`而不是`const char*`,那么你就不会遇到`cout`,但你也不会遇到`printf`的问题:`printf("%s \n ",st.c_str());`.我同意你的答案,但类型安全问题随着时间的推移而稀释...... gcc将通过在调用地点解析格式字符串来验证类型的正确性,从而提供编译器警告.标准不要求,但它就在那里. (3认同)

mar*_*cog 1

这两个例子做了不同的事情。后者将添加换行符并刷新输出( 的结果std::endl)。std::cout也较慢。除此之外,printf实现std::cout同样的目标,你可以选择你喜欢的。作为偏好问题,我会std::cout在 C++ 代码中使用。它更具可读性并且更安全。

如果您需要使用 格式化输出,请参阅本文std::cout