我在我的程序中有這if
語句,應該檢查啓動程序時輸入的參數。例如./a.out 2 2 + 0 x
(如果有人可以在英語這種類型的輸入參數的寫正確的名字,我將不勝感激如果語句檢查是否argv是一個數字
我if
語句應檢查是否進入參數不是一個數字:
if(atof(argv[cnt]) == 0 && argv[cnt] != "0")
但真當ARGB [CNT] = 0這是不幸的(用GDB檢查) 我做了什麼錯誤,以及如何解決它?
我在我的程序中有這if
語句,應該檢查啓動程序時輸入的參數。例如./a.out 2 2 + 0 x
(如果有人可以在英語這種類型的輸入參數的寫正確的名字,我將不勝感激如果語句檢查是否argv是一個數字
我if
語句應檢查是否進入參數不是一個數字:
if(atof(argv[cnt]) == 0 && argv[cnt] != "0")
但真當ARGB [CNT] = 0這是不幸的(用GDB檢查) 我做了什麼錯誤,以及如何解決它?
你可以在用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上,這是一個學習編程的非常好的平臺。
也許,在嘗試使用strtod()時,OP表示「數字」,輸入可能是「.1」。 – chux
'argv [cnt]!=「0」'是無稽之談。你根本沒有檢查它的價值。你不能在C中用這種方式比較字符串。它比較*指針*,在這種情況下,它總是不同的。 –
參數是一個「算術表達式」或「反向拋光表示法」 – sehe