c++ - 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';
}
解决方案
默认情况下,std::stringstream
'>>
运算符会跳过写空间。并且在 ASCII 中(一种典型但绝不是通用的编码)。0x20
是您按下键盘上的那个长按钮时得到的空格字符。
由于流中没有其他内容,因此 NUL 输出到c
.
引入机械手std::noskipws
是解决办法;即ss >> std::noskipws >> c;
读取值为 0x20。
推荐阅读
- sql - 仅从具有日文名称的表中选择特殊字符
- python - 从 Python 中的 year-mm-dd 行中切片年份
- sql - SQL 查询以检索同时存在两个代码的记录
- javascript - window.innerWidth 实时
- java - JIRA rest API 仅使用板名称获取板
- git - 推送回购的时间异常长
- c# - 我们如何使用 C# 代码执行三个迁移文件中的前两个?
- java - 我想使用 java 的库 Apache Poi 从 excel .xlsx 文件中读取,但我无法修复错误,代码无法编译
- android-studio - Android Studio 无法在 Mac OS Sierra 上启动
- reactjs - 是否可以在 react-redux 应用程序中不使用 combineReducers?