如何检查optarg的长度以及它是否为数字

时间:2017-11-21 21:16:41

标签: c command-line-arguments getopt

我使用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

1 个答案:

答案 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是否实际指向字符串的结尾
  • 检查字符串是否为空(经常被遗忘,感谢chux在另一个答案中提示)
  • 由于无符号短转换没有标准字符串,因此请使用limits.h确保在分配给unsigned short时没有溢出。