2011-09-10 108 views
1

我從C++中的數據文件中獲得了一些信息。一個信息是一個12個字符的長號碼。我怎麼能把這個從字符串轉換爲long long(我認爲long long最適合這個)而沒有數據丟失?將一個ASCII字符串轉換爲long long

回答

5

在C++中,沒有long long數據類型。 It's available in C99。但是,您可以使用int64_t。包括<stdint.h>。使用將字符串轉換爲int64_t

或者你可以寫一個轉換函數自己是:

int64_t convert(const std::string &s) 
{ 
    if(s.size() == 0) 
     std::runtime_error error("invalid argument"); 
    int64_t v = 0; 
    size_t i=0; 
    char sign = (s[0] == '-' || s[0] == '+') ? (++i, s[0]) : '+'; 
    for(; i < s.size(); ++i) 
    { 
     if (s[i] < '0' || s[i] > '9') 
      throw std::runtime_error("invalid argument"); 
     v = v * 10 + s[i] - '0'; 
    } 
    return sign == '-' ? -v : v; 
} 

測試代碼:

int main() { 
     try{ 
      std::cout << convert("68768768") << std::endl; 
      std::cout << convert("+68768768") << std::endl; 
      std::cout << convert("-68768768") << std::endl; 
      std::cout << convert("68768768x") << std::endl; 
     }catch(const std::exception &e) 
     { 
      std::cout << e.what() << std::endl; 
     } 
     return 0; 
} 

輸出:

68768768 
68768768 
-68768768 
invalid argument 

在線演示:http://ideone.com/nnSLp

0

一個64位的位整數足以表示任何12位十進制數(有足夠的空間可用)。因此,根據您的平臺,可能會有一個long就足夠了。如果是這種情況,您可以使用strtolstrtoul

如果您確實需要long long,請查看strtollstrtoull

+3

我要說那90%他會fi在他的平臺上只有32位,除非他用GCC編譯64位系統(或其他更特殊的編譯器) – xanatos

+1

也就是說,你可能會提到'strtol' /'strtoul'用於普通的longs。 。 –