2016-11-28 55 views
3

首先,我正在談論使用gcc編譯的舊式ANSI-C(我的意思是ANSI標準,沒有C99或更新版本)。我只允許使用下面代碼中可以看到的庫。如何檢查命令行參數是否爲整數

我的問題是我有一個被稱爲以如下方式對終端程序:

program < integer_1 integer_2 

雖然我已經能夠找出如何檢查參數的數目,我被困在檢查這些是否是整數。 如果程序被稱爲像這樣:

program < 1 -13 

它應該運行沒有抱怨,但如果像這樣運行:

program < s 7 

應該拋出一個錯誤。

無論我到目前爲止嘗試過的是完全垃圾。如果第二個數字是一個字符,我迄今爲止管理的最好的事情就是一個錯誤消息。我的嘗試中沒有一個能夠處理多個數字,但我已經找到了原因。

問題是我現在還沒有使用任何編程語言的命令行/終端參數(C++,Java)。我真的很感激,如果有人能告訴我如何檢查正確的輸入,坦白地說,我是出於想法。

我正確的說,如果我想處理大於9的數字,我必須從索引2開始遍歷argv,直到找到空格爲止?

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

int main(int arc, char *argv[]) 
{ 
    if(arc != 3) 
    { 
    printf("Error: You have entered %d arguments, but two were expected!", arc - 1); 
    return -1; 
    } 

    return 0; 
} 
+2

所有的命令行參數都是字符串。你可以使用'atoi()'將字符串轉換爲整數,而不需要檢查錯誤,或者使用'strtol()'或它的一個親屬來準確敏感但非常[微妙的錯誤檢查](http://stackoverflow.com/questions/14176123 /正確的用法 - 的 - 與strtol)。注意你的命令行顯示了一個'<',這意味着shell試圖使用下一個參數(例子中的'1'和's')給出的文件重定向標準輸入,並刪除'<'和命令行中的文件名。您應該簡單地刪除'<'符號。 –

回答

4

最簡單的辦法就是遍歷argv[n] S和一個傳遞一個給他們strtol()或相似。然後,檢查錯誤並做出決定。引述man page(重點煤礦)

long int strtol(const char *nptr, char **endptr, int base);

[...]

如果endptrNULLstrtol()專賣店在*endptr第一個無效字符的地址。如果根本沒有數字,strtol()將原始值nptr存儲在*endptr(並返回0)。 特別是,如果*nptr不是'\0'**endptr'\0'返回時,整個字符串是有效的。

也就是說,program < integer_1 integer_2是不完全傳遞命令行參數的方式。如果要將值參數作爲命令行參數傳遞,則應丟失重定向操作符並直接與argcargv[n]一起使用。

0

最好的方法是創建一個函數來檢查它是否爲數字。如果下面的函數返回true,則使用atoi(argv [])將它們轉換爲整數以進一步使用它。

bool isNumber(char number[]) 
{ 
    int i = 0; 

    //checking for negative numbers 
    if (number[0] == '-') 
     i = 1; 
    for (; number[i] != 0; i++) 
    { 
     //if (number[i] > '9' || number[i] < '0') 
     if (!isdigit(number[i])) 
      return false; 
    } 
    return true; 
} 
+0

我已經試過了。如果我這樣做的話,它可以工作:program_name 7 g或program_name gh tz,但是如果我先輸入一個字符/字符串,然後輸入如下的數字,它將不起作用:program_name:yu 5.這就是我陷入困境的一點當我自己嘗試時。 – Willi

+0

可否請您分享確切的測試案例... bcz代碼應該工作 –

+0

,並更新當前解決方案的帖子 –

0

你可以嘗試這樣的事情:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int check_cmd_args(char const *str[], int numargs); 

int 
main(int argc, char const *argv[]) { 

    if (argc < 2) { 
     printf("Not enough command line arguements entered\n"); 
     exit(EXIT_FAILURE); 
    } 

    if (check_cmd_args(argv, argc)) { 
     printf("All Command line arguements are integers\n"); 
    } else { 
     printf("Error, non-integer command line arguement entered\n"); 
    } 

    return 0; 
} 

int 
check_cmd_args(char const *str[], int numargs) { 
    int n, i = 0; 

    for (n = 1; n < numargs; n++) { 
     if (str[n][0] == '-') { 
      i = 1; 
     } 
     for (; str[n][i]; i++) { 
      if (!isdigit(str[n][i])) { 
       return 0; 
      } 
     } 
    } 
    return 1; 
} 
0

只是一個評論:不是一個答案

如果你要使用

program < arg1 arg2 

你不會看到ARG1或主要參數中的arg2。 arg1通常是一個文件名或設備,其中包含將由程序讀取的數據。我不知道該程序是否能夠訪問arg2。如果你想拿起arg1 arg2等,丟失<

program arg1 arg2