boost :: uint64_t的字符串因lexical_cast和stringstream而失败

时间:2013-03-18 14:09:37

标签: c++ boost 64-bit

我正在尝试将字符串转换为boost::uint64_tpvalue的内容为12345678901234567890。我现在使用的代码是:

void setAttribute(EnumAttrTyoe pname, const void *pvalue) {
    if (pname == SESS_ID) {
        const char *raw_sess_id = reinterpret_cast<const char*>(pvalue);
        std::string str_sess_id(raw_sess_id);
        std::cout << "Trying to open session id: '" << str_sess_id << "'\n";
        m_session_id = boost::lexical_cast<unsigned long long>(str_sess_id);
    }
}

这个抛出异常,消息“bad lexical cast:源类型值无法解释为目标”。相反,我使用此代码:

void setAttribute(EnumAttrTyoe pname, const void *pvalue) {
    if (pname == SESS_ID) {
        const char *raw_sess_id = reinterpret_cast<const char*>(pvalue);
        std::string str_sess_id(raw_sess_id);
        std::stringstream ss;
        ss << raw_sess_id;
        ss >> m_session_id;
    }
}

它通过,但m_session_id的值为0.我还没有检查ss的标志,但我不需要知道它失败了。任何想法现在该做什么?

UPDATE 没有C ++ 11,因为我无法使用它,而我的编译器是VC ++ 2008,升级版本为1.43.0。

2 个答案:

答案 0 :(得分:0)

此代码适用于我:

#include <sstream>
#include <cstdint>
#include <iostream>

int main()
{
   std::stringstream ss;
   ss << "12345678901234567890";

   std::uint64_t n = 0;
   ss >> n;

   std::cout << n << "\n";
}

http://liveworkspace.org输出:

  

标准输出:   12345678901234567890

答案 1 :(得分:0)

我认为您输入的C风格字符串不是您认为的那样。这个boost::lexical_cast的使用对我来说有助于提升1.42:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <boost/cstdint.hpp>

int main() {
   std::string s = "12345678901234567890";
   boost::uint64_t i = boost::lexical_cast<boost::uint64_t>(s);
   std::cout << i << '\n';
   return 0;
}

我的猜测是你的输入不是零终止,有一个你不期望的后缀,或者有一个像UTF16这样的替代编码。或许它甚至不是一个字符串。

相关问题