本文主要是总结一下自己在c++学习中的一些读取函数的特点以及他们的细节,加入一些自己的理解,以方便之后查阅
关于cin的直接输入符号>>
- 他是cin对象的一个运算符重载,返回值依然是一个istream对象所以可以用连写的方式输入。
- 他在输入的时候遇到空格,换行符时结束。
- 在使用的时候他会先洗碗后吃饭,吃完饭后不洗碗:
- 在使用之初他会先在缓冲区遍历,如果有存在内容那么他会直接读取内容,然后结束。但是如果存在空格或者换行符他会把这两个东西全部从缓冲区扔掉(洗碗),然后继续遍历,直到有内容读完结束或者没有内容等待键盘。
- 但是,在读取到空格或换行符结束的时候他不会把空格或换行符从缓冲区扔掉(不洗碗)。虽然如此,但是如果连续使用的时候我们会看到前人之碗后人来洗的一个状况,因而对于连续使用不会有影响。
关于cin的get()函数
他是cin对象的一个函数,所以使用的时候一定要用cin.get()这种方式来调用。
他有三种形态:
- cin.get(),这种形态返回值是读取到的字符,无参数,读取时从缓冲区直接读入下一个(无论是什么),如果缓冲区没有内容则等待键盘输入,同时读取完会把读到的那一个字符从缓冲区扔掉。
- cin.get(char &ch),这种形态有一个参数,读取到的字符存入这个参数中去,返回值是一个istream对象,所以和>>的形式一样是可以连写的。在读取的动作上他和上面一种形态一样。
- cin.get(char *buffer, int n, char ch = ‘\n’),和上面一样,这个样子也是可以连写的。这种形式是对于一个特定长度n或者遇到特定字符ch的字符串的读写,他会把读取到的字符串写入buffer的位置当中去,这个函数的使用一般是先开一个字符数组char a[n],然后把n当做get函数中的参数n来使用。
- 读取长度的注意事项:如果是遇到特殊字符结束那就是读到哪写入到哪,但是如果是遇到超过长度n的字符串,这种情况下我们一定是要读到n-1个字符就要截止的,因为我们最后要在字符数组末尾用一位去写’\0’。
- 截止条件:我们的第三个参数有一个初值’\n’,这个代表截止的字符,当然是可以更改的。
- 读取方式:前面我们说了一个先洗碗后吃饭,吃完饭后不洗碗,类比到这个地方我觉得就是不洗碗就吃饭,吃完饭后还是不洗碗,他在读取的时候先看缓冲区,如果有’\n’的存在,那么它会直接认为输入了一个空的字符串,在buffer的第一个字节写上’\0’,然后就直接结束了(不洗碗)。然后在结束的时候,他遇到的那个结束符(正常情况下是’\n’,但是可自定义)不会被他从缓冲区扔掉。【结果就是这个函数有个屎一样的特性那就是如果缓冲区里面有一个’\n’,你无论怎么调用这个函数,他都是一样卡在缓冲区那一个地方,解决方法就是.get()】
关于cin的getline()函数
这个函数就是用来解决上面那坨屎的
cin.getline(char *buffer, int n, char ch = ‘\n’),和上面的第三种形式基本上一模一样(其实我就是cv过来的),唯一的区别我只说一个点:不洗碗就吃饭,吃完饭后会洗碗,不过多解释了。
关于#include<string>的getline()函数
形式:getline(cin, string str)(我也不知道这是个啥写法,意会一下就好)
其实这个函数是很无辜的,只是长得比较像所以被拉过来打酱油了。
我们来看几个要点:
- 可以看到专门写了一个头文件string,首先上面的这些东西是istream里面的东西,不管是重载还是函数,而且使用的时候都是基于对象cin的,但是这个函数getline()尽管长得一模一样,却和cin只有半毛钱的关系,它是加了头文件string之后可以直接使用的。
- 然后他和string的关系,string是可以直接使用的,在iostream里面就有写,但是这个函数是写在string里面的,总之这个圈子还是挺乱的。
- 最后再说一下有关碗的问题,他和他自己是一样的(影分身之术?),饭前不洗碗饭后洗碗,总之就是这样。
- 哦,还有这个函数挺好用的,不用关❤预设的长度问题,但是效率会比较低,毕竟是string有关的。