std::字符串流十六进制转换错误

std::stringstream hex conversion error

本文关键字:转换 错误 十六进制 字符串 std      更新时间:2023-10-16

我尝试使用std::stringstream进行十六进制转换,如下所示:

std::stringstream s;
s << std::hex;
int i;
s << "100";
s >> i;     // 256
s << "10";  // doesn't work
s >> i;

但正如评论所指出的,它在随后的转换中失败了。我需要重置stringstream吗?为什么会失败?

您正在执行格式化输入,从字符串流中提取i后,设置eofbit。因此,您必须清除状态,否则以下所有格式化的输入/输出都将失败。

#include <sstream>
#include <iostream>
int main()
{
    std::stringstream s;
    s << std::hex;
    int i;
    s << "100";
    s >> i;     // 256
    std::cout << i << 'n';
    s.clear();  // clear the eofbit
    s << "10";  
    s >> i;     // 16
    std::cout << i << 'n';
    return 0;
}

如果在s << "10"之后检查流状态,您将看到操作失败。我不知道确切的原因,但你可以通过重置流来解决这个问题:

#include <iostream>
#include <sstream>
int main()
{
  std::stringstream s;
  s << std::hex;
  int i;
  s << "100";
  s >> i;     // 256
  std::cout << i << 'n';
  s.str("");
  s.clear(); // might not be necessary if you check stream state above before and after extraction
  s << "10";  // doesn't work
  s >> i;
  std::cout << i << 'n';
}

现场演示。