c++中 cin,cin.getline(),cin.get()的区别

cin, cin.getline(), cin.get()都是c++中的输入语法

cin:

一:cin的使用格式:

using namespace std;
char name2[20];
int a;
cin>>name;//name2可以是char类型,也可以是char数组;
cin>>a//a可以是各种整数类型 和 各种整数类型数组 比如 float,double,short,double[] float[].....

二:cin的读取输入时遇到空白符(空格 ,回车,制表符)的处理方法:

cin在不同位置遇到空白符有不同的处理方法

1:在行首遇到空白符,会直接忽略空白符(如果行首有多个空白符也会忽略多个空白符)读取下一个字符。

using namespace std;
char name[20];
cin>>name;
cout<<name;

c++中 cin,cin.getline(),cin.get()的区别_第1张图片

2:在行首以外的位置遇到空白符,被cin作为停止的标志(如果遇到除行首之外的空白符,cin会停止读取,并将空白符留在缓冲区)

using namespace std;
char name[20];
cin>>name;
cout<<name;

c++中 cin,cin.getline(),cin.get()的区别_第2张图片

cin.getline()

一:cin.getline()的作用:
cin.getline的作用是一次可以读取一整行的字符 (也是跟cin的区别所在,cin由于遇到空白符就停止输入,所以一次只能读取一个单词, 一直到换行符,也就是通过换行符来确定输入结尾。
二:cin.getline()的使用

1:cin.getline()接受两个参数,第一个参数是 用来存储输入行的数组名称, 第二个参数是 要读取的字符数

using namespace std;
	char name[30];
	cin.getline(name, 30);
	cout << name;

c++中 cin,cin.getline(),cin.get()的区别_第3张图片

如果 输入的字符数 超过了cin.getline的第二个参数我,则会截断输入的字符数到 第二个参数的值

using namespace std;
	char name[20];
	cin.getline(name, 20);
	cout << name;

c++中 cin,cin.getline(),cin.get()的区别_第4张图片
如果你数一下cout输入来的name值发现只有19个字符数,并没有20个的原因是因为 cin.getline读取时会在读入的字符串末尾自动加上’\0’,所以还要留一个空间给’\0’,因此cin.getline最多只能从缓冲区里面读取 第二个参数-1的字符串

2:cin.getline结束的两种情况:

第一种就是 cin.getline在没有读满 第二个参数-1 个之前,就读到了换行符,这时cin.getline将停止读入。
这种情况要注意的是 cin.getline 对 换行符 的处理(与下面要讲的 cin.get 的区别就在这里),cin.getline会将 换行符 读入 数组 中,之后将读入数组中的 换行符 替换成 ‘\o’;

第二种就是上面讲到的读到了 第二个参数-1位字符,比如第二个参数为20,则cin.getline读到了第19位就停止读取了(其他未读取到的字符将留在缓冲区),而数组中的第20位则被cin.getline 自动添加’\0’;

cin.get():

1:cin.get()的作用:

cin.get()的作用与cin.getline的作用一样,都是读取一整行的输入。

2:cin.get()的使用:

cin.get()也接受的两个参数 第一个参数是 用来存储输入行的数组名称, 第二个参数是 要读取的字符数(与cin.getline接受的参数一样)

using namespace std;
	char name[20];
	cin.get(name, 20);
	cout << name;
	return 0;

c++中 cin,cin.getline(),cin.get()的区别_第5张图片
3:cin.get与cin.getline的区别

其实cin.get与cin.getline很多东西都是一样的,只有一点不一样
就是在用户输入回车后,对换行符的处理方式;
cin.getline对 换行符 的处理是将 换行符 读入数组中并将 换行符 替换成‘\0’;
cin.get对 换行符 不读取,将换行符留着缓冲区中;

因此如果连续使用cin.get将出现一个问题

using namespace std;
	char name[20];
	char name2[20];
	cin.get(name, 20);
	cin.get(name2, 20);
	cout << name<<endl<<name2;
	return 0;

在这里插入图片描述
代码中使用了2个cin.get()分别读取字符到name和name2数组中,程序读取字符到name数组中没有问题,问题出在当程序需要输入给name2的字符时,直接结束程序了;

这就是换行符留在缓存区造成的问题,因为第一次使用cin.get()时输入换行符留在缓冲区里面,因此当第二次使用cin.get()时,cin.get()会先读取缓冲区的换行符,cin.get()读到换行符表示输入完成,因此程序没有等你输入就直接结束了;

解决方法:在c++中提供了一个 cin.get(两个参数) 的变体,就是 cin.get(没有参数) 这一个变体不需要传入任何参数,这一个变体的作用就是读取缓冲区的下一个任意字符(也包括换行符);

using namespace std;
	char name[20];
	char name2[20];
	cin.get(name, 20);
	cin.get();//没有传入参数的变体
	cin.get(name2, 20);
	cout << endl<<name<<endl<<name2 ;

	return 0;

c++中 cin,cin.getline(),cin.get()的区别_第6张图片

上面的代码通过cin.get(没有参数)这个函数将缓冲区的 换行符 给读取了,因此缓冲区中没有换行符,cin.get(name2,20)可以正常运行;

变体cin.get();

1:变体cin.get()的使用
变体cin.get()的作用是读取缓冲区的下一个字符,存储到括号里面的变量,因此cin.get(ch),代表把读取缓冲区的下一个字符,存到ch里面去,cin.get()代表读取缓冲区的下一个字符,但是不存入如何位置;

你可能感兴趣的:(c++)