c++ - C++ 中的 std::ws 与 std::skipws
问题描述
我将从一小段代码开始解释我的问题:
#include <iostream>
#include <string>
int main(){
int val;
string s;
std::cin >> val;
std::getline(std::cin >> std::ws, s);
std::cout << val << s << std::endl;
return 0;
}
我知道 usingstd::cin >> val
会在缓冲区中留下换行符。
如果std::getline(std::cin, s)
之后使用,它会简单地跳过输入,因为它会从 捕获那个空格cin
,但是如果我们这样做std::getline(std::cin >> std::ws, s)
,它应该会按预期工作,因为std::ws
它将消耗所有前导空格。
现在我的问题是,根据我的理解(),还有这样的事情std::skipws
应该做同样的事情std::getline(std::cin >> std::skipws, s);
,但这要么是不正确的,因为使用它仍然会跳过输入,或者我使用它是错误的。
- 为什么
std::skipws
在这种情况下不起作用? std::ws
和有什么区别std::skipws
?- 我们什么时候应该使用
std::skipws
overstd::ws
? - 为什么我们有两个相同的实现?两者都应该摆脱空格(根据我目前的理解)
解决方案
std::skipws
(and std::noskipws
) 仅适用于格式化输入,即operator>>
使用流的sentry
类(sentry
实际跳过的类)。它们对未格式化的输入没有影响,例如std::getline()
不使用sentry
. 他们设置/清除流的内部标志,该标志对所有后续格式化skipws
读取保持有效,直到显式更改,该标志不会在每次读取后重置,就像其他一些标志一样。每次在格式化读取期间创建时,它都会查看当前标志并采取相应措施。sentry
skipws
std::ws
无条件地从输入流中读取空白。它仅在每次读取的基础上使用。当您有时确实想跳过空白时,它非常适合与未格式化的输入一起使用,但并非总是如此。
推荐阅读
- ag-grid - 反应 ag-grid - 等待“网格调整大小”事件的“结束”,然后才执行操作
- vuejs2 - 关于 VueJs 中的 DOM 操作的困惑
- angular - *matCellDef、*matHeaderCellDef 和 *ngIf 在同一个容器中
- ipa - 从 .ZIP 转换为 .IPA
- node.js - 无法解析 'C:\Portal\\node_modules\string_decoder\node_modules\safe-buffer' 中的 'buffer'
- python - 根据行中值的百分位排名对数据框进行评分 - Python
- python - 在 Python 中集成 MySQL + Tkinter 的问题
- spring-boot - @Entry 没有硬编码的基础
- python - 根据 PEP8 字典中的长行
- python - python请求:请求期间出现SSL错误?