我知道 iostream 会有缓冲区来存储I / O数据。说,我有一些像这样的C ++代码。 C++ code 由于StackOverflow不允许我在此问题中嵌入图片,因此如果您不想点击链接,请输入代码。
int main(){
int Val1, Val2;
string String_Val;
cin >> Val1;
cin >> Val2;
cin.ignore(1);
getline(cin, String_Val);
}
为什么cin.ignore(1)有效?这里' S
My idea of how the buffer looks like。
缓冲区不会有两个\ n \ n \ n \ n \ n \ n \ n因为我按cin>>两次点击返回/输入键Val1然后由cin>> Val2。根据{{3}} cin>>应该将\ n留在堆栈中。因此,我认为只有cin.ignore(2)可以丢弃缓冲区中的两个第一个字符。另外,
getline(cin >> ws, String_Val);
根据this StackOverflow question也适用。难道不应该只移除空格,并且不应该在缓冲区中以换行符的形式表示空格吗?
最后,如果有人碰巧知道任何交互式程序或者在程序运行时帮助我可视化缓冲区的方法,那将会非常有用。像this StackOverflow thread这样的东西。
万分感谢!
答案 0 :(得分:0)
您的代码无法可靠地运行。默认情况下,cin >>
会在读取值之前跳过任何前导空格,因此在读取Val1
之前将跳过Val2
之后的任何换行符。这就是为什么在阅读Val2
之后忽略一个字符可能有效,但是如果用户输入任何额外的空格,它将无法正常工作(你将忽略一个空白字符,但getline()将读取其他任何内容直至同一行Val2
的末尾。
你会发现很多SO问题,并以一种强有力的方式展示和解释如何忽略所有内容,包括下一个换行符,但总结如下:
#include <limits>
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');