cin
的读取字符规则:
cin
遇到回车、空格、tab键 结束,但是缓冲区还存在这三个字符,并没有将这三个字符丢弃,且指针光标在这三个字符之前,也就是说,下一次通过其他输入函数读取时,是可以读到这三个字符的。
cin.get
的读取字符规则:
-
读取字符:
以回车键结束,并且会将回车键作为一个字符读入,读完回车键之后,指针光标移到回车键后面,如果后面还有输入的话,会读取下一字符。故下图不会像后面读取字符串一样介绍的不跳过回车键
如下所示,使用cin.ignore
将回车符丢弃,程序便能够正常运行。
读取字符串
以回车键结束,读取到前面残留的回车会直接结束,并且指针光标不会跳过回车键,当输入3【回车】之后,再次使用cin.get,然后想输入4【回车】是读取不到该输入值的。
但是你不用输入,程序会直接结束,因为前一个输入的回车并没有舍弃,而是在缓冲区,这时读取到的是缓冲区的回车而直接结束。
以下是不使用cin.ignore
丢弃缓冲区的字符的结果:
指针光标不跳过回车键:注释掉cin.ignore之后,可以看到程序只输入5【回车】,就直接结束了,而且输入了5个空串,后面的输入语句看似没有执行,其实执行了,读取的是缓冲区中遗留下的回车键,并且cin.get函数遇到回车不会将指针光标移到回车后,故造成了读到的一直是回车,所以结束
cin.getline和cin.get函数类似,所不同的是,cin.getline遇到回车会将指针光标后移,具体看后面cin.getline的贴图。
(cin.ignore的作用默认是丢弃缓冲区的一个字符)。
我们可以看到cin>>len之后,回车了,而且后面也有cin.get要求输入,但是程序却直接自动执行结束,说明读取字符串时,指针光标不会跳过回车键,除非人为添加cin.ignore()或者getchar()读走回车键,程序才能正常运行.
如下所示,使用cin.ignore
将回车符丢弃,程序便能够正常运行。
cin.getline
的读取字符规则:
读取字符串:回车键结束
当读到回车键的时候,此次读取结束,会将指针光标移到回车键之后,从而下一次读取的是回车键之后的字符。
当我们输入2【回车】
后,使用cin.ignore
丢弃了回车符,所以再输入12【回车】
时,直接读取12,指针光标移到回车之后,而第二次读取时,读取的是我们输入的23,而不是12的回车键。
如果我们注释掉第一个cin.ignore
之后,可以看到,我们输入2【回车】
后,len
读取了2,然后cin.getline
遇到前面缓冲区留下的回车键,结束此次读取操作,并将指针光标移动至回车之后,然后执行下一次读取操作,我们输入23,可以看到第二次读取到了23这个字符串。
总结
-
cin
① cin>> 右面是一个字符时,从缓冲区读取一个非空白字符的字符后停止读取。
② cin>> 右面是一个字符串时,从缓冲区读取数据,若第一个字符为空白字符,则忽略并丢弃,读取下一个字符,直到遇到空白字符时停止读取,此空白符留在缓冲区。 -
cin.get()
① 无参数时,读入一个字符,包括换行符,常用来处理输入缓冲区中的换行符。
② 接受一个参数时,格式为 cin.get(char ch);,读入一个字符后结束读取。
③ 接受两个参数时,格式为 cin.get(array_name, ArSize);,从缓冲区读取数据,达到行尾或者读取了 ArSize - 1 个字符为止,且超过规定的字符数不会出现错误,会直接截断,cin.get() 不对此换行符进行处理,并将其留在缓冲区。 -
cin.getline()
接受两个参数,格式为 cin.getline(array_name, ArSize);,函数从缓冲区读取数据,达到行尾或者读取了 ArSize - 1 个字符为止,且超过所规定的字符数会出现错误,cin.getline() 读取换行符后将其替换为空字符,并丢弃。 -
getline()
声明在头文件中
接受两个参数,格式为 getline(cin, string_name);,从缓冲区读取数据,遇到换行符时结束读取,且 getline() 读取此换行符后将其替换为空字符,并丢弃。