2013-02-13 79 views
2

是否有可能處理C中的數據類型不匹配例外?如何處理C中的數據類型不匹配例外

在C++和其他更高級別的語言中,代碼通常被try ... catch包圍。但是,由於C中沒有異常處理機制,我們如何處理數據類型不匹配異常?

例如,讓我們假設我有一個程序,要求用戶輸入一個整數。如果用戶錯誤地擊中了字母字符,則程序崩潰。我如何在C中處理這個問題?

下面是一些示例代碼:

#include "stdafx.h" 

void main() 
{ 
    int x = 0; 
    printf("Hello World!\n\n"); 
    printf("Please enter an integer: "); 
    scanf("%d", &x); 
    printf("\n"); 
    printf("The integer entered is %d", x); 
    printf("\n\n"); 
    printf("Press any key to exit!"); 
    getchar(); 
    getchar(); 
} 
+1

錯誤檢查?如果你的程序在無效輸入時崩潰,你只是不足以驗證它。 – Mat 2013-02-13 08:35:58

+0

有人可以舉個例子嗎?我對C編程語言很陌生。 – Matthew 2013-02-13 08:36:43

+1

這根本不是C特有的。有可能約。一個四分之一英鎊的例子來檢查網絡上可用函數的返回值。 – Mat 2013-02-13 08:41:27

回答

3

我會假設你正在使用scanf來處理輸入。該程序不應該崩潰。您需要閱讀scanf的手冊頁,並在返回值部分中告訴您該函數返回匹配的項目數。你比較這個數字與預期的數字。如果他們不同,你採取適當的行動。

編輯

馬修和巴特的一些代碼:

int i; 

if (scanf("%d", &i) == 1) 
{ 
    print("You have entered %d\n", i); 
} 
else 
{ 
    printf("You have entered an invalid number\n"); 
} 
-2

C使用返回值和errno全球,表示如果出現了錯誤與否。所以,你的情況,我們假設(因爲你沒有提供任何代碼),你正在使用strtol翻譯字符串轉換成整數:

char *s = "1234"; 
int number; 
number = strtol(s, NULL, 10); 

如果數量爲0errno設置,出事了。

C中的所有函數都以這種方式工作。爲了使您的代碼更健壯,請讀取字符串而不是數字並將其轉換。

事實上,在異常和返回代碼上有很多可以找到的東西。在我看來,異常應該用於例外情況。而不正確的數據輸入並不例外(實際上這更多的是一個規則;-)),因此連接轉換時不應該拋出異常。也許這就是C#也有一個TryParse方法的原因。

+0

所以0不再是一個整數?! – 2013-02-13 08:53:26

+0

-1不是我的,但'atoi'真的是一個不好的例子 – 2013-02-13 08:53:30

+0

@JensGustedt會'strtol'會好些嗎?重點是使用返回碼而不是例外。 – 2013-02-13 08:54:19

2

將代碼添加到@EdHeal上面正確說的內容中。 示例代碼示例:

INT主(INT ARGC,字符**的argv){

int num; 
int ret; 

printf("Enter a number\n"); 
ret=scanf("%d",&num); 
/* For better clarity From the man page 
Upon successful completion, these functions shall return the number of successfully matched and assigned input items; this number can be zero in the event of an early matching failure */ 
printf("Number of items assigned %d",ret); 
printf("The input number is %d",num); 
return (EXIT_SUCCESS); 

}

所以在這裏爲您simplicty看到的scanf statment的返回值。一旦成功,即讀取整數時,它返回1。在字符串的情況下,它讀取0。

樣本輸出 a)輸入的整數

Enter a number 
68 
Number of bytes read 1 
The input number is 68 
RUN SUCCESSFUL (total time: 2s) 

b)中輸入的字符串

Enter a number 
yiy idfd 
Number of bytes read 0 
The input number is 2665608 
RUN SUCCESSFUL (total time: 4s) 
+0

這行不正確'printf(「讀取的字節數%d」,ret);'它是格式化字符串中的項目數,如輸出結果所示。 – 2013-02-13 08:59:22

+0

@EdHeal Yup!匆忙寫道。感謝您指出。 ! – rockstar 2013-02-13 09:07:18

1

用於數據輸入的幾個選項:

可以使用的scanf如上面提到的,但我也推薦閱讀關於getopt的手冊頁,getoptlong

至於驗證你可以嘗試regcomp,regexec,regerror,regfree。例如:

const char* pattern = "^[\\+,-]*[0-9]*$"; 
    regex_t regex; 
    int reti; 
    reti = regcomp(&regex, pattern, REG_EXTENDED); 
    if(reti){ 
    printf("error"); 
    exit(1); 
    } 
    reti = regexec(&regex, "34567", 0, NULL, 0); 
    if(reti == 0) { 
    printf("String matches pattern."); 
    }