我使用getopt
来解析传递给我的c程序的参数。我想在解析它时检查optarg
是否全部正确,但我不知道如何在optarg
中获取值的长度:
int opt;
unsigned short port;
while((opt = getopt(argc, argv, "p:")) != EOF) {
switch(opt) {
case 'p':
for(int i = 0; i < OPTARG_LENGTH; i++) {
if(!isnum[optarg[i]]) exit();
}
port = strtoul(optarg, NULL, 10);
break;
}
那么如何找到OPTARG_LENGTH
?
答案 0 :(得分:3)
strlen(optarg)
会向您提供该信息,但不要尝试使用该天真方法检查整数值,让strtoul
为您进行精确检查。
为此你必须修改你调用它的方式在char指针上传递指针,以便strtoul
指出错误(如果有的话)。
(例如,如果数字超过无符号长限,则检查无用)
另请注意,port
是未签名的短片,因此您必须在分配之前执行额外检查,否则您将会溢出。
char *temp;
unsigned long port_ul = strtoul(optarg,&temp,10);
if (optarg != temp && *temp == '\0' && port_ul <= USHRT_MAX) // needs #include <limits.h>
{
// argument is properly parsed: ok
port = port_ul;
}
检查分为3部分:
*temp
是否实际指向字符串的结尾limits.h
确保在分配给unsigned short时没有溢出。