前言
学了c++一阵日子了,对于一些常见的输入方法却总是云里雾里,为什么cin.getline之后不用cin.get吸收回车?为什么cin之后就需要,cin之前也不需要?getchar,getche,getch,它们之间区别有哪些。这些东西我总是搞忘,然后查资料,然后搞忘。现在就让我来一一总结一下。
一、cin.get
1.有三个重载形式。
cin.get()可以吸收单个值而不返回;
a=cin.get cin.get(a)都是将返回值赋给a的方法;
cin.get(str,n)是将输入的n-1 个值给str,第n个值默认为‘\0’,此方法在遇到回车符时结束。最后缓冲区仍留下回车符。
也可写cin.get(str,n,‘a’)遇到a结束
二、cin.getline()
cin.getline(str,n)是将输入的n-1 个值给str,第n个值默认为‘\0’,此方法在遇到回车符时结束。最后缓冲区不留下回车符。(但也不吸收回车符)
三、cin
输入结束条件 :遇到Enter、Space、Tab键。
当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,(因此,输入前先回车不影响结果)若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。
不想略过空白字符,那就使用 noskipws 流控制。比如cin>>noskipws>>input;
四.getline
getline函数的参数使用了string字符串,所以声明在了<string>头文件中了。
也是将输入的字符串赋给string而不是char数组,与上述cin.get与cin.getline不同。
getline(cin,str)为其用法,getline()遇到结束符时,会将结束符一并读入指定的string中,再将结束符替换为空字符。;
五.scanf
与cin在细节上相同
六、getchar()
函数名:getchar()
头文件:stdio.h
功 能:读取控制台输入的字符,并保存在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。
七、getch()
函数名:getch()
头文件:conio.h
功 能:从控制台读取一个字符,但不显示在屏幕上(不带回显)。
原 型:int getch(void)
返回值:读取的字符
八、getche()
函数名:getche()
头文件:conio.h
功 能:输入后立即从控制台取字符,不以回车为结束,且立刻显示在屏幕上(带回显)。
用 法:int getche(void);
p.s
对getche,输入回车再输出它的ascll码能看到其是13而不是10,这是为什么?
原因是,按下回车键在windows其实有两个符号\r \n,getche首先接受的是\r。通常来说。C语言会自动将回车转化为\n,而getch()则是比较低级的,会越过这个处理,貌似没有经过输入流缓冲,而是直接调用键盘服务中断获得的,就是原始按键。因此仍是\r \n。这里有详情解释。