一、导论
二、cin的工作原理
三、cin的使用语句
四、关于cin的输出规则
一、导论
cin是c++中比较常用的输入方法,不过cin有很多的种类,且在其使用方面略有差异,比如说cin,cin.get,cin.getline等诸多规则,所以今天我们就来讨论一下cin这个语句。
二、cin的工作原理
cin的工作原理为:当执行cin时候,键盘的输入会存入缓冲区,之后cin会根据相应的参数(比如说我们要求cin只读取缓冲区中的一位,那么我们就读取它的一位)把缓冲区的值读取出来,留给接下来的程序使用。
三、cin的几种使用语句
目前来说cin的使用语句主要有以下几种:cin>>,cin.get()和cin.getline()。先说一下cin>>,他是cin中比较常见的输入模式,多个输入时按照回车作为分隔符,但是回车本身不作为输入部分。
cin.get(),他有多种工作模式,比较常用的有这几种,第一种是int 参数 = cin.get(),第二种是cin.get(b),第三种是cin.get(array,位数)(当然前提是不能出现数组越界),三种方法都可以输入字符,前两者是用来输入单个字符,最后的那个可以按照位数来获取字符,但是cin.get有个问题,就是说他可以识别回车,以如下程序为例:
char a;
char b;
std::cout<<"please input a,b"<<std::endl;
a = std::cin.get();
std::cin.get(b);
std::cout<<"a is:"<<a<<std::endl;
std::cout<<"b is:"<<(int)b<<std::endl;
如果我们输入2+Enter,那么此时输入的是2和10(10的原因在于Enter在ASIC码中是10)。
cin.getline(),他是c++当中的一种特有函数,它的使用方法与cin.get基本相同,不过他和get的不同之处在于getline是不识别回车的,get识别回车,另外来说getline比get更能做的一点在于他可以控制缓冲区的数据是否全部取出。我们以如下程序为例,
1 char array[20];
2 char b;
3 std::cout<<"please input a,b"<<std::endl;
4 std::cin.getline(array, 5);
5 std::cin.clear();
6 std::cin.get(b);
7 std::cout<<"array is"<<array<<std::endl<<"b is"<<b<<std::endl;
我们首先把第5行注释掉,然后我们输入12345,然后我们执行,那么我们此时执行出来的结果是什么呢?Array=1234,而b=NULL。
之后我们把第5行恢复,接着我们同样输入12345,那么我们此时执行出现的结果是什么呢?Array=1234,而b=5。那么为什么会出现这样的情况呢?当然两者的差别在于第5行,这句话的作用就在于把缓冲区的数据全部都拿出来了,接着我们解释一下上述两者现象,首先注释掉第五行的现象:当我们输入12345后,该数据全部送到缓冲区,接着我们执行第一个cin语句,此时array=1234,此时缓冲区中还有5这个数字,接着我们继续执行第二个cin,此时他读不到数据(因为我感觉cin是一次取出的,不回去缓冲区取第二次,目前我只能这么解释),那么此时输出的结果为NULL。好的,接着我们解释第二个现象,该数据全部送到缓冲区,接着我们执行第一个cin语句,此时array=1234,由于此时有clear函数,那么此时12345全部取出,接着我们继续执行第二个cin,此时他可以读取到数据5,那么此时输出的结果为NULL。
接着我们说一cin.ignore语句,这么语句的目标是可以忽略cin中的一些输入,举个例子:
1 char str1[20];
2 char str2[20] {NULL};
3 std::cout<<"please input a,b"<<std::endl;
4 std::cin.getline(str1, 5);
5 std::cin.clear();
6 std::cin.ignore(5);
7 std::cin.getline(str2, 5);
8 std::cout<<"str1 is"<<str1<<std::endl;
9 std::cout<<"str2 is"<<str2<<std::endl;
首先我们把第六行注释掉,此时我们输入1234567890abcd,那么此时的结果是什么呢?Str1=1234,str2=5678。但是如果我们把第六行恢复,此时我们输入1234567890abcd,那么此时的结果是什么呢?Str1=1234,str2=0abc,这是因为中间的ignore函数自动忽略了5个字符,才导致了这个现象。
今天主要聊了一下cin的工作原理和相关模式,希望这篇博客对大家有帮助