首页 > 解决方案 > 0x20 被视为 0x00 与字符串流

问题描述

下面的程序将 0x20 写入 stringstream,然后读取该值并且它是 0。为什么会这样以及如何写入一个值以使其被读取为 0x20?

#include <iostream>
#include <sstream>

int main() {
  std::stringstream ss;
  ss << (char) 0x20;
  char c;
  ss >> c;
  if ( c == 0x20 ) {
    std::cout << "32";
  } else if ( c == 0 ) {
    std::cout << "0";
  } else {
    std::cout << "other";
  }
  std::cout << '\n';
}

标签: c++

解决方案


默认情况下,std::stringstream'>>运算符会跳过写空间。并且在 ASCII 中(一种典型但绝不是通用的编码)。0x20是您按下键盘上的那个长按钮时得到的空格字符。

由于流中没有其他内容,因此 NUL 输出到c.

引入机械手std::noskipws是解决办法;即ss >> std::noskipws >> c;读取值为 0x20。


推荐阅读