簡體   English   中英

檢查命令行參數中是否僅使用數字

[英]Checking That Only Digits are Used in a Command-line Argument

我正在開發一個接受一個命令行參數的程序,我只希望它接受數字。 我希望它返回 1 並打印“Usage: ./caesar key”,如果有任何不是數字的東西,例如,如果用戶在命令行中輸入 20x 而不是 20。我已經為它創建了一個代碼,但發現即使命令行參數只包含數字,它也會返回 1 並打印“Usage: ./caesar key”。 有人對如何解決這個問題有一些建議嗎?

    for (int i = 0, len = strlen(argv[1]); i < len; i++)
    {
        if (isdigit((char)argv[i]) == false)
        {
            printf("Usage: ./caesar key");
            printf("\n");
            return 1;
        }
        else
        {
            printf("success");
        }
    }
  1. isdigit的返回值是 integer 而不是 boolean,因此您可能無法獲得合適的比較結果。 在某些方面,返回值可以像 boolean 一樣使用,但不能用於直接值比較。 無論如何,您不需要在 C 中進行直接值比較,因此只需從您的代碼中刪除== false並放一個! isdigit面前是最好的。

  2. 如果您從argv[i]中刪除了(char)強制轉換,那么編譯器會告訴您您正在使用指針作為 integer 沒有強制轉換。 這是因為 argv 是一個指針數組(在使用中有點像二維數組,但有一些區別)。 當你只索引這個值一次時,你會得到一個指針,必須再次索引它才能獲得傳遞給 isdigit 的字符。 保持這一點的一種有用方法是在循環之前聲明一個設置為等於argv[1]const char *變量,然后在循環中使用它,而不用擔心直接使用 argv 帶來的額外內容。

  3. 您沒有處理argv[1]""NULL的情況(盡管您之前可能已經完成了NULL測試)。

  4. 由於無論如何您都將遍歷字符串 (char[]),並且 strlen 必須遍歷字符串才能找到結尾,因此您可以更改整個循環而不知道它的邊界,只需檢查'\0'然后進行isdigit測試。

暫無
暫無

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

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