如果optarg(來自Getop庫的標誌-s之後的參數)不是數字,我希望打印出錯誤消息並終止程序,如果它是一個數字,大小需要設置爲optarg。我遇到的問題是,像-s r這樣的命令會輸出錯誤信息,-s 2也會,這意味着它將2解釋爲字符串。C使用isdigit檢查optarg是否是數字
調試與-s 2
#1 printf("%d",atoi(optarg));
#2 printf("%d",isdigit(atoi(optarg)));
我得到線#1, int值2和0爲線路#2 int值。
所以我想知道爲什麼isdigit(atoi(optarg)))給了我一個0,當atoi(optarg)給了我一個int。有沒有更好的方法來檢查optarg是否是int?
int main (int argc, char *argv[]){
int size;
char option;
size = 0;
const char *optstring;
optstring = "rs:pih";
while ((option = getopt(argc, argv, optstring)) != EOF) {
switch (option) {
case 'r':
type_set = 1;
break;
**case 's':
capacity_set = 1;
if(isdigit(atoi(optarg))==0){
fprintf(stderr,"Argument after -s needs to be an int\n");
return 0;
}**
else{
size = atoi(optarg);
}
break;
default{
return 0;
}
不過需要注意的(我知道你知道克里斯),那的atoi提供*零*能夠捕獲任何轉換錯誤只需傳遞第一個字符就可以了,只要'+/-'不能進行數字轉換。 –
這就是爲什麼我建議不要使用atoi,特別是如果你只是想要一個數字(如OP說的)如果你真的想接受一個*號*而不是一個*數字*,那麼你需要別的東西 –
沒有敲門,我投了票,我只是想要確定OP瞭解'atoi'是有侷限性的。我特別喜歡使用第一個字符,但如果用戶試圖指定「+/-」(這確實是一個角落 - 但是是真實的),它也具有'isdigit'限制。 –