15、【C語言基礎】錯誤處理、遞歸
阿新 • • 發佈:2018-09-19
png lose 讓我 指針 ++ 自身 actor 計算 16px 和 strerror() 函數來顯示與 errno 相關的文本消息。
C 錯誤處理
C 語言不提供對錯誤處理的直接支持,但是作為一種系統編程語言,它以返回值的形式允許您訪問底層數據。在發生錯誤時,大多數的 C 或 UNIX 函數調用返回 1 或 NULL,同時會設置一個錯誤代碼 errno,該錯誤代碼是全局變量,表示在函數調用期間發生了錯誤。您可以在 errno.h 頭文件中找到各種各樣的錯誤代碼。
所以,C 程序員可以通過檢查返回值,然後根據返回值決定采取哪種適當的動作。開發人員應該在程序初始化時,把 errno 設置為 0,這是一種良好的編程習慣。0 值表示程序中沒有錯誤。
errno、perror() 和 strerror()
C 語言提供了 perror()
- perror() 函數顯示您傳給它的字符串,後跟一個冒號、一個空格和當前 errno 值的文本表示形式。
- strerror() 函數,返回一個指針,指針指向當前 errno 值的文本表示形式。
讓我們來模擬一種錯誤情況,嘗試打開一個不存在的文件。您可以使用多種方式來輸出錯誤消息,在這裏我們使用函數來演示用法。另外有一點需要註意,您應該使用 stderr 文件流來輸出所有的錯誤。
1 #include <stdio.h> 2 #include <errno.h> 3 #include <string.h> 4 5 extern int errno ; 6 7 int main () 8 { 9 FILE * pf; 10 int errnum; 11 pf = fopen ("unexist.txt", "rb"); 12 if (pf == NULL) 13 { 14 errnum = errno;//得到錯誤號 15 fprintf(stderr, "錯誤號: %d\n", errno); 16 perror("通過 perror 輸出錯誤"); 17 fprintf(stderr, "打開文件錯誤: %s\n", strerror( errnum )); 18 } 19 else 20 { 21 fclose (pf); 22 } 23 return 0; 24 }
執行結果:
錯誤號: 2 通過 perror 輸出錯誤: No such file or directory 打開文件錯誤: No such file or directory
被零除的錯誤
在進行除法運算時,如果不檢查除數是否為零,則會導致一個運行時錯誤。
為了避免這種情況發生,下面的代碼在進行除法運算前會先檢查除數是否為零:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 main() 5 { 6 int dividend = 20; 7 int divisor = 0; 8 int quotient; 9 10 if( divisor == 0){ 11 fprintf(stderr, "除數為 0 退出運行...\n"); 12 exit(-1); 13 } 14 quotient = dividend / divisor; 15 fprintf(stderr, "quotient 變量的值為 : %d\n", quotient ); 16 17 exit(0); 18 }
執行結果:
1 除數為 0 退出運行...
程序退出狀態
通常情況下,程序成功執行完一個操作正常退出的時候會帶有值 EXIT_SUCCESS。在這裏,EXIT_SUCCESS 是宏,它被定義為 0。
如果程序中存在一種錯誤情況,當您退出程序時,會帶有狀態值 EXIT_FAILURE,被定義為 -1。所以,上面的程序可以寫成:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 main() 5 { 6 int dividend = 20; 7 int divisor = 5; 8 int quotient; 9 10 if( divisor == 0){ 11 fprintf(stderr, "除數為 0 退出運行...\n"); 12 exit(EXIT_FAILURE); 13 } 14 quotient = dividend / divisor; 15 fprintf(stderr, "quotient 變量的值為: %d\n", quotient ); 16 17 exit(EXIT_SUCCESS); 18 }
執行結果:
quotient 變量的值為 : 4
C 遞歸
遞歸指的是在函數的定義中使用函數自身的方法。
語法格式如下:
1 void recursion() 2 { 3 statements; 4 ... ... ... 5 recursion(); /* 函數調用自身 */ 6 ... ... ... 7 } 8 9 int main() 10 { 11 recursion(); 12 }
流程圖:
C 語言支持遞歸,即一個函數可以調用其自身。但在使用遞歸時,程序員需要註意定義一個從函數退出的條件,否則會進入死循環。
遞歸函數在解決許多數學問題上起了至關重要的作用,比如計算一個數的階乘、生成斐波那契數列,等等。
【示例】數的階乘
1 #include <stdio.h> 2 3 double factorial(unsigned int i) 4 { 5 if(i <= 1) 6 { 7 return 1; 8 } 9 return i * factorial(i - 1); 10 } 11 int main() 12 { 13 int i = 15; 14 printf("%d 的階乘為 %f\n", i, factorial(i)); 15 return 0; 16 }
【示例】斐波那契數列
1 #include <stdio.h> 2 3 int fibonaci(int i) 4 { 5 if(i == 0) 6 { 7 return 0; 8 } 9 if(i == 1) 10 { 11 return 1; 12 } 13 return fibonaci(i-1) + fibonaci(i-2); 14 } 15 16 int main() 17 { 18 int i; 19 for (i = 0; i < 10; i++) 20 { 21 printf("%d\t\n", fibonaci(i)); 22 } 23 return 0; 24 }
15、【C語言基礎】錯誤處理、遞歸