学了编程4年了,输入输出一直都在用,但一直都处在模模糊糊的状态。每次使用是都得现查,今天把这个好好总结下,方便以后使用。
这里只关注实际的使用,理论上暂且不管。
这儿主要关注以下几个函数:
(1)、cin(这个也就暂且当它是个函数吧)
(2)、get
(3)、getline
(4)、gets
(5)、getchar
一、cin
这个cin是istream对象,从标准输入中读取数据。要注意的是有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数 直接从输入缓冲区中取数据它基本的读取规则是:cin是遇到回车停止输入,按照空格输出的。空格、回车等会被丢弃(这些还在缓冲区中,下次若用cin会自动丢弃),下次又会读取流中剩下的内容。
所以说,在读取字符串的时候一般使用cin>>string; 但是就像上面说的使用cin>>是不能读取带有 空格、回车之类的字符串的。
二、get
get可以读取包含空格符、回车符、制表符在内的几乎所有字符,它的结束条件是回车。它的使用主要包括以下两部分
1、读入单个字符:读入单个任意字符可以使用cin.get(ch)和ch=cin.get()。基本上使用区别不大,具体的比较见下图。
2、读入多个任意字符:常用的有以下两种
(1)、cin.get(数组名,接收字符数目) //默认截止字符换行符
(2)、cin.get(数组名,接收字符数目,截至字符)
注意:以上两个函数在遇到截至字符时,本次读取完毕,但是截止字符依然保持在流中。所以如果想要读取一串带回车符的字符串,使用第一种方式是不行的,因为它把回车符当成了截止字符,会自动停止读入,这样的话就只能采取第二种方式了。
三、getline
对于getline来说,这里包含两部分。
1、cin的成员函数即:cin.getline:这种方式主要有两种用法:
(1)、cin.getline(数组名,接收字符数目) //默认截止字符换行符
(2)、cin.getline(数组名,接收字符数目,截至字符)
与上面的get读入多个字节函数类似。但是需要注意的是getline()函数会自动丢弃换行符等分界符。
2、string的成员函数即:getline()。与上面的类似,这种方式也主要有两种用法:
(1)、getline(cin,string类型)
(2)、getline(cin,string类型,截止字符)
基本用法和上一种cin成员函数方式差不多,不同的是接收的时候一个是数组,一个是string类型。
note:
这里要稍微注意,有的时候刷题需要获取一行,而且要与cin>> 一起连用,要注意一点的是cin>> 会在输入缓冲区中保留回车符(一般咱输入都会输入回车符),这个时候如果后面直接是getline的函数,就会首先读取这个回车符,而不是我们想要的接下来的数据
。所以一般这种情况,我们都会使用cin.get() 跳过这个回车符。
四、gets
gets(s);
其中s为字符串变量(字符串数组名或字符串指针)。
但是这个函数没有内存检查机制,在C11中已经删除,所以不推荐使用。
五、getchar
getchar()接受一个字符输入,包含空格,遇到回车停止。和cin.get()接收一个字符差不多。不过不能接收回车符。