cin, cin.getline(), cin.get()都是c++中的输入语法
一: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;
2:在行首以外的位置遇到空白符,被cin作为停止的标志(如果遇到除行首之外的空白符,cin会停止读取,并将空白符留在缓冲区)
using namespace std;
char name[20];
cin>>name;
cout<<name;
一:cin.getline()的作用:
cin.getline的作用是一次可以读取一整行的字符 (也是跟cin的区别所在,cin由于遇到空白符就停止输入,所以一次只能读取一个单词, 一直到换行符,也就是通过换行符来确定输入结尾。
二:cin.getline()的使用
1:cin.getline()接受两个参数,第一个参数是 用来存储输入行的数组名称, 第二个参数是 要读取的字符数
using namespace std;
char name[30];
cin.getline(name, 30);
cout << name;
如果 输入的字符数 超过了cin.getline的第二个参数我,则会截断输入的字符数到 第二个参数的值
using namespace std;
char name[20];
cin.getline(name, 20);
cout << name;
如果你数一下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’;
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;
其实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;
上面的代码通过cin.get(没有参数)这个函数将缓冲区的 换行符 给读取了,因此缓冲区中没有换行符,cin.get(name2,20)可以正常运行;
1:变体cin.get()的使用
变体cin.get()的作用是读取缓冲区的下一个字符,存储到括号里面的变量,因此cin.get(ch),代表把读取缓冲区的下一个字符,存到ch里面去,cin.get()代表读取缓冲区的下一个字符,但是不存入如何位置;