簡體   English   中英

C : 非常確定一個參數是一個 int 參數

[英]C : Veryfing that a parameter is an int parameter

在我的程序中,我需要驗證傳遞給程序的參數是一個整數,所以我創建了這個小函數來處理用戶輸入“1”而不是“1”的情況。

問題是它根本不起作用。 我嘗試調試,我只能告訴你參數是 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;
 }
}

我希望一切都清楚,謝謝你的幫助;)

如果要檢查字符是否為十位數字之一,則需要使用字符常量'0''1'等(不是整數常量01等)。

一旦您解決了已經指出的問題,您可能應該查找isdigitisspace並使用它們來更干凈地編寫函數。 另一種可能性是使用strcspnstrpbrk類的東西在一個步驟中進行搜索。

只需使用strtol這將轉換整數,您可以從第三個參數中判斷它是否成功。

描述見strtol(3)

首先,我很驚訝您的代碼通過編譯,並帶有一個名為 long 的變量。 但是,您真正的問題是您使用的是數字 0-9,而不是開關中的字符'0''9'

您可能想添加一個break; i++;之后的語句i++; 聲明。 否則,您將始終通過default分支“跌倒”並返回 0。

更新:[這是一個老問題,但為了完整起見]

除了缺少的break語句之外,您還不清楚如何處理用戶輸入的字符串在數字之間包含空格的情況: 123 456 您的函數將其標識為整數,但我認為這應該標記一個錯誤。

除了其他答案,請考慮使用isdigit代替。 還要考慮重命名您的函數以反映它的真正作用(例如intsAndSpacesOnly

您可以將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;
}

long也是一個不能用作標識符的關鍵字。

如果您使用ctype.h ,特別是 isdigit 或

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

我假設您的意思是一個正整數,因為如果傳入負數,您的代碼將失敗,同樣如果傳入指數(例如,1000 作為 1e3)。 后者可能很少你需要擔心,但前者可能需要考慮 - 我不知道你驗證的目的是什么,但只是一個提示:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM