我将从一段简短的代码开始解释我的问题:
#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::skipws
over std::ws
?std::skipws
(and std::noskipws
) 仅适用于格式化输入,即operator>>
,它使用流的sentry
类(这sentry
是进行实际跳过的类)。它们对未格式化的输入没有影响,例如std::getline()
不使用sentry
. 它们设置/清除流的内部skipws
标志,该标志对所有后续格式化读取保持有效,直到明确更改为止,该标志不会在每次读取后重置,就像其他一些标志一样。每次sentry
在格式化读取期间创建 时,它都会查看当前skipws
标志并相应地采取行动。
std::ws
无条件地从输入流中读取空格。它仅在每次读取的基础上使用。当您有时确实想跳过空格但并非总是如此时,它非常适合与未格式化的输入一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句