2012-06-18 25 views
0
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
     if(argc != 2) 
       return 1; 
     if(!atoi(argv[1])) 
       printf("Error."); 
     else printf("Success."); 
     return 0; 
} 

當我輸入一個低於或高於零值的參數時,我的代碼有效。當字符串表示零時使用atoi?

[[email protected] programming]$ ./testx 1 
Success. 
[[email protected] programming]$ ./testx -1 
Success. 
[[email protected] programming]$ ./testx 0 
Error. 

它爲什麼不起作用?

+2

它怎麼樣? '(!0)'是真的。唯一的問題是你拼寫錯誤「atoi返回0」。 –

回答

14

這很簡單,atoi返回轉換的數字,你的情況正好是0(如預期)。

使用atoi時,沒有檢查轉換是否實際成功的標準方法。

既然你正在編寫C++,你可以得到更好的錯誤使用std::istringstreamstd::stoi(C++ 11)或strtol(任意數字打交道時,這是一個更好的界面)檢查的結果相同。


的std :: istringstream例如

#include <sstream> 

    ... 

std::istringstream iss (argv[1]); 
int res; 

if (!(iss >> res)) 
    std::cerr << "error"; 

的std :: strtol將例如

#include <cstdlib> 
#include <cstring> 

    ... 

char * end_ptr; 

std::strtol (argv[1], &end_ptr, 10); 

if ((end_ptr - argv[1]) != std::strlen (argv[1])) 
    std::cerr << "error"; 

的std :: Stoi旅館(C++ 11)

#include <string> 

    ... 

int res; 

try { 
    res = std::stoi (argv[1]); 

} catch (std::exception& e) { 
    std::cerr << "error"; 
} 
+1

「strtol」的+1。 –

+0

啊,是的。我應該更徹底地閱讀文檔,現在感覺有點愚蠢。投票選出一個好的替代解決方案,並將其標記爲可接受的答案。謝謝! – Griffin

+1

在C++ 11中還有'stoi',它會拋出一個異常。 – chris

3

由於0在C表示false和任何非零值意味着true。並且atoi("0")返回0,因此if語句分支到else子句。

1

man-page明確指出,即atoi()無法檢測到錯誤。它總是返回一個數字,在你的情況下是0

所以你的代碼的計算結果爲if (!0)這是真的,因此它錯誤地表示錯誤。

沒有選項可以使用atoi()進行錯誤處理,因此您應該使用strtoul()/strtol()來代替。 (請參閱手冊頁)。