当cin>>
从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>
会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>
不做处理。
但是,getline() 读取数据时,并非像 cin>>
那样忽略第一个换行符,getline()
发现 cin
的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串,你会发现getline
没有读入你想要读入的字符串。getline
读取一行字符时,默认遇到’\n’时终止,并且将’\n’直接从输入缓冲区中删除掉,不会影响下面的输入处理。
自然而然,我们想到了在进行输入时,对输入缓冲区进行清空和状态条件的复位。条件状态的复位使用clear()
(清除错误标志),清空输入缓冲区应该使用:
函数原型:istream &ignore( streamsize num=1, int delim=EOF );
函数作用:跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)
参考文档:
[1] C++ cin 的详细用法
[2] cin>>,cin.get(),cin.getline()会把换行符留在缓冲区