簡體   English   中英

如何檢查optarg的長度以及它是否為數字

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

我使用getopt來解析傳遞給我的c程序的參數。 我想在解析它時檢查optarg是否全部正確,但我不知道如何在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指出錯誤,如果有的話。

(例如,如果數字超過未簽名的長期限制,則您的支票無效)

另請注意, 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時沒有溢出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM