2012-05-21 69 views
4

_wtoi當不能轉換輸入時,所以輸入不是整數,返回零。但同時輸入可以爲零。這是一種確定是否存在錯誤輸入或零的方法嗎?_wtoi返回零:輸入零或非數字輸入?

+2

不,這這就是爲什麼沒有人在實際代碼中使用'atoi' /'wtoi'。 – ildjarn

+1

確實,[wcstol()](http://msdn.microsoft.com/en-us/library/w4z2wdyc)可以更好地完成這項工作。 –

+0

@來自MSDN的FrédéricHamidi:「如果不能執行轉換,則返回0」,所以同樣的問題 – Alecs

回答

4

這是C++,你應該使用stringstream做你的轉換:

#include <boost/lexcal_cast.hpp> 

// ... 
std::string s = "1234"; 
int i = boost::lexical_cast<int>(s); 

如果你堅持用C,sscanf

#include <iostream> 
#include <sstream> 

int main() 
{ 
    using namespace std; 

    string s = "1234"; 
    stringstream ss; 

    ss << s; 

    int i; 
    ss >> i; 

    if (ss.fail()) 
    { 
     throw someWeirdException; 
    } 
    cout << i << endl; 

    return 0; 
} 

一個更清潔,更方便的解決方案與升壓轉換器的lexical_cast存在可以乾淨地做到這一點。

const char *s = "1234"; 
int i = -1; 

if(sscanf(s, "%d", &i) == EOF) 
{ 
    //error 
} 

您還可以使用strtol與它需要一點點的思維警告。是的,它會返回兩個字符串評估爲零,併爲錯誤爲零,但它也有一個參數(可選)endptr這將指向數字之後的下一個字符一個已經轉換:

const char *s = "1234"; 
const char *endPtr; 
int i = strtol(s, &endPtr, 10); 

if (*endPtr != NULL) { 
    //error 
} 
+0

這真的是最佳做法嗎?我期望使用stringstream有相當多的開銷:創建流對象,爲存儲的字符串創建一個容器,將字符串(或可能是它的一個副本)添加到流中,將流中的字符串組合成單個字符串送入wtoi處理器,最後解析數字。另外你怎樣才能做到這一點非基地10? – Rup

+0

@rup將輸入例如在'std :: stringstream'之前輸入到'std :: hex'。 –

+0

感謝您的解釋! – Alecs

相關問題