2015-10-16 96 views
1

我在我的程序中有這if語句,應該檢查啓動程序時輸入的參數。例如./a.out 2 2 + 0 x(如果有人可以在英語這種類型的輸入參數的寫正確的名字,我將不勝感激如果語句檢查是否argv是一個數字

if語句應檢查是否進入參數不是一個數字:

if(atof(argv[cnt]) == 0 && argv[cnt] != "0") 

但真當ARGB [CNT] = 0這是不幸的(用GDB檢查) 我做了什麼錯誤,以及如何解決它?

+2

'argv [cnt]!=「0」'是無稽之談。你根本沒有檢查它的價值。你不能在C中用這種方式比較字符串。它比較*指針*,在這種情況下,它總是不同的。 –

+0

參數是一個「算術表達式」或「反向拋光表示法」 – sehe

回答

2

你可以在用C strtol(3)(或strtod(3)double s)表示,其管理的結束指針:

char* end = NULL; 
long n = strtol(argv[cnt], 0, &end); 
if (n > 0 && *end == '\0') 
    printf("got a good number %ld\n", n); 

您還可以使用sscanf(3)%n。請注意,它返回一個掃描項目計數:

int p= -1; 
long n = 0; 
if (sscanf(argv[cnt], "%ld %n", &n, &p) >= 1 && p>0) 
    printf("got a good number %ld (and scanned %d bytes)", n, p); 

順便說一句,如果你需要比較字符串,使用strcmp(3)argv[cnt] != "0"正在比較地址,並且我確定在您的(或我的)系統上它總是如此(即使對於0程序參數),因爲程序參數在call stack中,但文字字符串在code segment中。

如果您在C++11編碼瞭解std::string(其operator ==你想象的),也許std::istringstream

不要忘了所有警告和調試信息(gcc -Wall -Wextra -g)編譯,然後使用調試器gdb)。

PS。我希望你在Linux上,這是一個學習編程的非常好的平臺。

+0

也許,在嘗試使用strtod()時,OP表示「數字」,輸入可能是「.1」。 – chux

相關問題