perror(s) 用來將上壹個函數發生錯誤的原因輸出到標準設備(stderr)。參數 s 所指的字符串會先打印出,後面再加上錯誤原因字符串。此錯誤原因依照全局變量errno(這裏的說法不準確,errno是壹個宏,該宏返回左值) 的值來決定要輸出的字符串。在庫函數中有個errno變量,每個errno值對應著以字符串表示的錯誤類型。當妳調用"某些"函數出錯時,該函數已經重新設置了errno的值。perror函數只是將妳輸入的壹些信息和現在的errno所對應的錯誤壹起輸出。
strerror函數是通過標準錯誤的標號,獲得錯誤的描述字符串 ,將單純的錯誤標號轉為字符串描述,方便用戶查找錯誤。
其次,了解兩函數的原型不同:
perror()原型:
#include <stdio.h>
void perror(const char *msg);
它是基於errno的當前值,在標準出錯上產生壹條出錯信息,然後返回。它首先輸出由msg指向的字符串,然後是壹個冒號,壹個空格,接著是對應於errno值的出錯信息,最後是壹個換行符。
strerror()原型:
#include <string.h>
char * strerror(int errnum);
此函數將errnum(它通常就說errno值)映射為壹個出錯信息字符串,並返回此字符串的指針。
最後,兩函數的使用具體區別如下:
perror是將errno對應的錯誤消息的字符串打印到標準錯誤輸出上,即stderr或2上,若妳的程序將標準錯誤輸出重定向到/dev/null,那就看不到了,就不能用perror了。而 strerror的作用只是將errno對應的錯誤消息字符串返回,要怎樣處理完全由妳自己決定。通常我們選擇把錯誤消息保存到日誌文件中,即寫文件,所以通常可以用fprintf(fp, "%s", strerror(errno))將錯誤消息打印到fp指向的文件中。其中perror中errno對應的錯誤消息集合跟strerror是壹樣的,也就是說不會漏掉某些錯誤。