2011-09-10 65 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。 。 –