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

How to check for length of optarg and if it is numeric

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

strlen(optarg) 会为您提供该信息,但不要尝试使用那种幼稚的方法检查整数值,让 strtoul 为您进行精确检查。

为此,您必须修改调用它的方式以在 char 指针上传递指针,以便 strtoul 指出错误(如果有的话)。

(比如超过unsigned long limit,你的check就没用了)

另请注意,port 是一个无符号短整型,因此您必须在分配之前执行额外检查,否则会溢出。

char *temp;
unsigned long port_ul = strtoul(optarg,&temp,10);

if (optarg != temp && *temp == '[=10=]' && port_ul <= USHRT_MAX)  // needs #include <limits.h>
  {
    // argument is properly parsed: ok
    port = port_ul;
  }

检查分为 3 个部分:

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