首页 > 解决方案 > 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);,但这要么是不正确的,因为使用它仍然会跳过输入,或者我使用它是错误的。

标签: c++buffer

解决方案


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

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


推荐阅读