2016-11-18 60 views
1

我知道,這兩個可以作爲錯誤信息的工作,perror和fprintf與stderr有什麼區別?

perror(" "); 
fprintf(stderr, " "); 

但什麼是真正的它們之間的差異?各自的優點/缺點是什麼?

+0

這只是你不能將格式參數傳遞給'perror'。所以它稍快... –

+0

'perror(「foo」)'基本上等於'fprintf(stderr,「foo:%s \ n」,strerror(errno))''。我喜歡使用'fprintf(stderr,「foo:%s。\ n」,strerror(errno))',但僅僅是因爲'perror()'輸出末尾沒有'.'會導致我錯誤。請記住,如果遇到* fatal *錯誤,例如'malloc()'失敗,或者程序無法打開所需的文件,則需要*報告錯誤並使用exit退出程序(EXIT_FAILURE);'或'abort();'。 –

回答

4

the perror() standard

的PERROR()函數將映射通過 符號errno爲語言相關的錯誤消息,訪問的錯誤編號,其將被 寫入標準錯誤流如下:

  • 首先(如果s是不是一個空指針和字符指向s不是空字節),該字符串指向秒,然後一個 <結腸>和<空間>。

  • 然後出現錯誤消息字符串,然後是<換行符>。

錯誤消息的字符串的內容應是相同 由字符串錯誤()返回的帶有參數的errno。

所以,

perror(" "); 

會發出類似

: invalid argument 

stderr,取決於errno當前值。

fprintf(stderr, " "); 

將僅發射空格字符stderr,而不是打印當前errno值的字符串表示。

fprintf(stderr, " ");孤立是很無用的。 perror(" ");將提供有關當前值errno的數據。

+0

因此,使用perror驗證函數返回值將永遠是好的做法,perror會自動發送到stderr而不傳遞任何參數 –

+0

@jorgesaraiva一般來說,是的,因爲這會給你一些指示*爲什麼*失敗。 –