1. 程式人生 > >15、【C語言基礎】錯誤處理、遞歸

15、【C語言基礎】錯誤處理、遞歸

png lose 讓我 指針 ++ 自身 actor 計算 16px

C 錯誤處理

C 語言不提供對錯誤處理的直接支持,但是作為一種系統編程語言,它以返回值的形式允許您訪問底層數據。在發生錯誤時,大多數的 C 或 UNIX 函數調用返回 1 或 NULL,同時會設置一個錯誤代碼 errno,該錯誤代碼是全局變量,表示在函數調用期間發生了錯誤。您可以在 errno.h 頭文件中找到各種各樣的錯誤代碼。

所以,C 程序員可以通過檢查返回值,然後根據返回值決定采取哪種適當的動作。開發人員應該在程序初始化時,把 errno 設置為 0,這是一種良好的編程習慣。0 值表示程序中沒有錯誤。

errno、perror() 和 strerror()

C 語言提供了 perror()

strerror() 函數來顯示與 errno 相關的文本消息。

  • 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語言基礎】錯誤處理、遞歸