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;
}

我知道使用std::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::skipwsover std::ws
  • 为什么我们有 2 个相同的实现?两者都应该摆脱空格(根据我目前的理解)
雷米勒博

std::skipws(and std::noskipws) 仅适用于格式化输入,即operator>>,它使用流的sentry类(这sentry是进行实际跳过的类)。它们对未格式化的输入没有影响,例如std::getline()不使用sentry. 它们设置/清除流的内部skipws标志,该标志对所有后续格式化读取保持有效,直到明确更改为止,该标志不会在每次读取后重置,就像其他一些标志一样。每次sentry格式化读取期间创建 时,它都会查看当前skipws标志并相应地采取行动。

std::ws无条件地从输入流中读取空格。它仅在每次读取的基础上使用。当您有时确实想跳过空格但并非总是如此时,它非常适合与未格式化的输入一起使用

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章