如果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'限制。 –