检查命令行输入是否为有效整数(C)
我试图验证程序的用户是否在命令行中输入了有效的整数。我遇到了一个问题:它拒绝所有输入 这是我的检查命令行输入是否为有效整数(C),c,string,char,integer,command-line-arguments,C,String,Char,Integer,Command Line Arguments,我试图验证程序的用户是否在命令行中输入了有效的整数。我遇到了一个问题:它拒绝所有输入 这是我的 // Make sure input is a valid int char *ptr = NULL; long int input = strtol(argv[i+1], &ptr, 10); if(ptr == NULL){ userMinInt = input; minIntSet = true; } else fprintf(stderr, "You m
// Make sure input is a valid int
char *ptr = NULL;
long int input = strtol(argv[i+1], &ptr, 10);
if(ptr == NULL){
userMinInt = input;
minIntSet = true;
}
else
fprintf(stderr, "You must enter a valid integer for <min-int>. Using default value of %ld\n", minInt);
//确保输入是有效的int
char*ptr=NULL;
长整数输入=strtol(argv[i+1],&ptr,10);
如果(ptr==NULL){
userMinInt=输入;
minIntSet=true;
}
其他的
fprintf(stderr,“必须为输入有效的整数。使用默认值%ld\n”,minInt);
多亏了彼得,我解决了这个问题。以下是新的工作代码:
// Make sure input is a valid int
char *ptr = NULL;
long int input = strtol(argv[i+1], &ptr, 10);
if(ptr != NULL && *ptr == (char)0){
userMinInt = input;
minIntSet = true;
}
else
fprintf(stderr, "You must enter a valid integer for <min-int>. Using default value of %ld\n", minInt);
//确保输入是有效的int
char*ptr=NULL;
长整数输入=strtol(argv[i+1],&ptr,10);
如果(ptr!=NULL&&*ptr==(char)0){
userMinInt=输入;
minIntSet=true;
}
其他的
fprintf(stderr,“必须为输入有效的整数。使用默认值%ld\n”,minInt);
代码正在检查结束指针是否为NULL
。相反,代码应该检查:
1) 结束指针是否指向空字符'\0'
?
2) 结束指针与开始指针是否不同
其他检查如下:
char *start = argv[i+1]; // maybe should be argv[i]
char *ptr;
// set errno to 0 for subsequent check
errno = 0;
long int input = strtol(start, &ptr, 10);
if (ptr == start) {
fprintf(stderr, "No conversion done.\n");
}
else if (*ptr != 0) {
fprintf(stderr, "Extra data after the number.\n");
}
else if (errno) {
fprintf(stderr, "Number outside long range.\n");
}
else if (input < INT_MIN || input > INT_MAX) {
fprintf(stderr, "Number %ld outside int range.\n", input);
}
else {
printf("Number is %d.\n", (int) input);
}
char*start=argv[i+1];//也许应该是argv[i]
char*ptr;
//将errno设置为0以进行后续检查
errno=0;
长整数输入=strtol(启动和ptr,10);
如果(ptr==开始){
fprintf(stderr,“未完成转换。\n”);
}
如果(*ptr!=0),则为else{
fprintf(stderr,“数字后的额外数据。\n”);
}
else if(errno){
fprintf(stderr,“长范围外的数字。\n”);
}
else if(输入INT_MAX){
fprintf(stderr,“数值%ld超出int范围。\n”,输入);
}
否则{
printf(“编号为%d.\n”,(int)输入);
}
我想这就是答案。@peter啊,我明白了。所以你不检查null,而是检查(char)0;什么是i
?执行此操作之前,请确保选中i+1
this@MattMcNabb这在for(int i=0;iargv[argc]
的for循环中始终为空,因此您将在最后一次循环迭代中读取空指针。若要修复此问题,请使循环条件为i+1
不需要强制转换,您可以在不更改程序行为的情况下删除它。@MattMcNabb在C中不是(int)0等于NULL?不完全是NULL
是一个宏,可以扩展到0
或(void*)0
,应该在需要指针的地方使用。但这与*ptr==0
无关。我认为,if(errno)
应该是if((input==LONG_MIN | | input==LONG_MAX)&&errno==ERANGE)
-errno
成功后可能会被更改。@mafso同意提议的if()
会起作用,但不同意它的需要。调用strtol()
设置范围错误的errno
,否则不会更改:“库函数调用可以将errno
的值设置为非零,无论是否存在错误,只要本国际标准中的函数描述中未记录errno
的使用。”C11§7.5 3和strtol()
规范包括:“……如果正确的值超出可表示值的范围,……并且宏ERANGE
的值存储在errno
”§7.22.1.4中。Linux手册页似乎与此相矛盾(尤其是代码示例)。标准C函数和POSIX或GNU函数可能不同?不管怎样,我相信这个案子。谢谢@mafso我对errno
的含义/处理上的一些潜在矛盾进行了审查,并同意您的意见,但没有发现任何支持“errno
成功后可能会更改”的内容。Did find:“通过检查调用后errno
是否有非零值来确定是否发生了错误。”(IAC,这听起来像是一个很好的SO问题。)From:“允许成功的函数更改errno
”[emph.不是我的]我将查看POSIX和一些手册页,尝试glibc的一些函数,看看我能不能写个问题(如果你不打算写的话)。