[英]C what happens putting int* as parameter where parameter type is 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'
等(不是整數常量0
、 1
等)。
一旦您解決了已經指出的問題,您可能應該查找isdigit
和isspace
並使用它們來更干凈地編寫函數。 另一種可能性是使用strcspn
或strpbrk
類的東西在一個步驟中進行搜索。
只需使用strtol
這將轉換整數,您可以從第三個參數中判斷它是否成功。
描述見strtol(3)
首先,我很驚訝您的代碼通過編譯,並帶有一個名為 long 的變量。 但是,您真正的問題是您使用的是數字 0-9,而不是開關中的字符'0'
到'9'
。
您可能想添加一個break;
i++;
之后的語句i++;
聲明。 否則,您將始終通過default
分支“跌倒”並返回 0。
更新:[這是一個老問題,但為了完整起見]
除了缺少的break
語句之外,您還不清楚如何處理用戶輸入的字符串在數字之間包含空格的情況: 123 456
。 您的函數將其標識為整數,但我認為這應該標記一個錯誤。
除了其他答案,請考慮使用isdigit
代替。 還要考慮重命名您的函數以反映它的真正作用(例如intsAndSpacesOnly
)
您可以將isdigit
和isspace
函數用作:
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.