Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查命令行输入是否为有效整数(C)_C_String_Char_Integer_Command Line Arguments - Fatal编程技术网

检查命令行输入是否为有效整数(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的一些函数,看看我能不能写个问题(如果你不打算写的话)。