【问题标题】:How to check for length of optarg and if it is numeric如何检查 optarg 的长度以及它是否为数字
【发布时间】:2018-05-05 11:51:51
【问题描述】:

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

【问题讨论】:

    标签: c command-line-arguments getopt


    【解决方案1】:

    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;
      }
    

    检查分三部分进行:

    • 检查*temp 确实指向字符串的末尾
    • 检查字符串是否为空(经常被遗忘,感谢 chux 在另一个答案中的提示)
    • 由于没有标准字符串到 unsigned short 转换,请使用 limits.h 确保在分配给 unsigned short 时不会溢出。

    【讨论】:

    • 感谢您的快速回答!你能告诉我optarg != temp 是做什么的吗?什么是检查溢出的好方法?
    • 已经投票了,但是如果一个空字符串被传递给strtoul(),并且空字符串测试被遗忘了,你会得到port == 0(可能需要也可能不需要),但没有未定义行为,是吗?
    • 是的,strtoul 在这种情况下会返回 0,这对于端口号是不可接受的,因此您也可以使用糟糕的atoi 进行转换并在这种情况下检查 > 0,但那是不是很学术,不能一概而论。
    • 糟糕的atoi 我说:) 请注意,如果strtoulNULL 作为第二个参数一起使用,它也不是很有用......在c 中正确解析整数的艺术。 ..
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多