(#1)cin>>,cin.get(),cin.getline()会把换行符留在缓冲区,而(#2)cin.get(),getline(),cin.getline会读入换行符。
原文链接:https://blog.csdn.net/a262624/java/article/details/87952612
所以,在使用了#1后,要使后面的#2输入能够正常读入,需要在后面加cin.get()或者cin.ignore(100, ‘\n’)。前者是从缓冲区中拿走换行符,后者是忽略点换行符。
c++ 中cin.ignore(100,’\n’);就是忽略cin中的前100个字符,或是’\n’之前的字符
(因为cin会屏蔽’\n’,所以后一个条件不会起作用,可以改成’#‘试试)。
如:
string str;
cin.ignore(5, ‘#’);
cin >> str;
cout << str << endl;
如果输入 “12345678”,回车,那么输出就是"678",因为字符中没有包含’#’,就是忽略前5个。
如果输入 “123#45678”,回车,那么输出就是"45678",忽略’#'之前的。
当然,如果总共输入的数据少于5,且没有"#",那就全忽略了。
可以把cin.ignore(x, y)中的参数看成两个条件,x条件表示忽略x个,y条件就表示忽略y之前的字符,y条件优先级高于x。
平常,我们单独用 cin>>str 的时候,流缓冲区里面还没有字符,那么执行这句之后就等待用户输入。
但是用了 cin.ignore之后,从这句就开始往流里面输入了,只不过输入到流里面的数据会按参数的要求去清除那些, 到后面这句 cin >> str的时候,流里面存在的是按条件清除之后的的数据,直接输出给str了。
参考地址:1.https://blog.csdn.net/wxbmelisky/article/details/48596881
2.https://blog.csdn.net/qq_38665104/article/details/82179096