原型
printf和perror都可以在屏幕上打印信息。那么这两个有什么区别呢?
首先看函数原型:
#include <stdio.h>
void perror(const char *s); // perror - print a system error message
#include <stdio.h>
int printf(const char *format, ...);
显著区别:
- perror只能接收一个字符串,比如perror(“prefix:”)
接收的字符串会被作为前缀,后面会自动打印错误信息。 - printf无需多言
使用
perror打印错误信息非常方便:
perror("prefix:")
//输出:
// prefix: info about errno
而printf想要打印错误信息,需要这样写:
printf("prefix: %s\n", strerror(errno));
//输出:
// prefix: info about errno
区别总结
可以看到,printf想要打印错误信息,需要配合函数strerror和linux系统变量errno一起使用。而perror只需要简单传入一个前缀就好了。这是使用方法上两者的区别。
此外,printf的是往标准输出(stdout)上打印,而perror是往标准错误输出(stderr)上打印。printf的fmt参数末尾必须要带上’\n’,才能促使printf函数将写入缓冲区的数据打印到屏幕上;若不加’\n’,则每次调用完printf后,不会立即打印,要等到缓冲区满或者在程序中手动调用fflush(stdout)函数时才会打印到屏幕上。这点要尤其注意。
而perror的stderr是不缓冲、立即打印的。
综上,如果是打印错误信息,尤其是调用系统调用函数或库函数导致的错误,首选perror,因为使用简单且内容自动刷新到屏幕上;如果对格式有更多定制化的要求,那么可以使用printf、strerror、errno,但是结尾记得加’\n’,以确保数据及时刷新到屏幕上。