2010-11-01 26 views
0

在我的程序中,我需要驗證傳遞給程序的參數是一個整數,所以我創建了這個小函數來處理用戶輸入「1st」而不是「1」。C:VeryFing參數是一個int參數

問題是它根本不起作用。我嘗試調試,我可以告訴你的是參數是12和長是2.(12是我想測試的值,2是傳遞給函數的數字的數量)

int intOnly(char *toCheck, int longeur) { 
int i = 0; 
while (i < longeur) { 
    switch (toCheck[i]) { 
    case 0: 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    case 9: 
    case ' ': 
    i++; 
    default: 
    return 0; 
    break; 
    } 
    return 1; 
} 
} 

我希望一切都清楚了, 感謝您幫助;)

+3

'長'是一個關鍵字,你不能用它作爲變量名。 – casablanca 2010-11-01 17:14:10

+1

隨着空間的存在,這段代碼將接受「2 3 1」(在將'0'更改爲'0'等之後) – 2010-11-01 17:16:08

回答

11

如果要檢查一個字符的十位數字之一,你需要使用的字符常量'0''1'等(不整數常數,0,1等)。

1

首先,我很驚訝你的代碼通過一個名爲long的變量來獲得過去的編譯。但是,您的真正問題是您使用的是交換機中的數字0-9,而不是字符'0''9'

+0

我修改了它,因爲它是一個法語變量名,所以在我的代碼中我實際上沒有「long」:) – 2010-11-01 17:15:48

+0

英文翻譯將是'length'。 – 2010-11-01 17:22:53

1

您可能需要在i++;聲明之後添加break;聲明。否則,您將始終'落在'default分支並返回0.

1

除了其他答案之外,請考慮使用isdigit來代替。也可以考慮重新命名功能,以反映它確實(如intsAndSpacesOnly

5

只需使用strtol這將轉換成整數,你可以從第三PARAM判斷它成功了。

關於描述,參見strtol(3)

7

一旦你定已經被指出的問題,你應該查找isdigitisspace並用它們來更清晰地寫函數。另一種可能性是使用諸如strcspnstrpbrk之類的東西來一步完成搜索。

1

您可以使用isdigitisspace功能:

int intOnly(char *toCheck, int len) { // long is reserved word..use len. 
    int i = 0; 
    while (i < len) { 
     if(!isdigit(toCheck[i]) && !isspace(toCheck[i])) 
      return 0; 
     i++; 
    } 
    return 1; 
} 

而且是不能作爲標識符使用關鍵字。

+0

這也是一個很好的解決方案:)謝謝 – 2010-11-01 17:22:11

1

你可以讓你的生活更輕鬆,你的代碼,如果你使用ctype.h短,特別是ISDIGIT或

if(toCheck[i] >= '0' && toCheck[i] <= '9' || toCheck[i] == ' '){ 
+0

謝謝;)我很確定會這樣做 – 2010-11-01 17:18:05

1

我假設你的意思是一個正整數,彷彿負數傳遞你的代碼將失敗in,類似地如果指數被傳入(例如,1000作爲1e3)。後者可能是罕見的,你需要擔心,但前者可能是需要考慮的事情 - 我不知道你要驗證什麼目的,但只是單挑:-)

相關問題