【发布时间】:2021-07-12 03:29:59
【问题描述】:
我将从一小段代码开始解释我的问题:
#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而不是std::ws? - 为什么我们有两个实现相同的东西?两者都应该摆脱空格(根据我目前的理解)
【问题讨论】:
-
请记住
skipws是默认设置的。您实际上不必选择使用它,而是选择何时显式禁用它。 -
回复:“它只是跳过输入”——这不是实际发生的情况。正如您所说,它会看到换行符,并终止该读取操作。您键入的输入仍然存在,并且将在后续读取操作中看到。