C++输入字符
输入特性
- cin结束标识符的空白=空格、回车、制表符
- 系统通过回车识别用户完成信息键入
- 所谓从输入过程实际是系统从键盘输入缓冲队列中读取字符的过程,该过程在全部键入信息(回车结尾)后进行
cin:你的名字
#include<iostream>
#include<iomanip>
int main() {
using namespace std;
char name[50];
cout << right<<setw(20)<<"请输入Name:";
cin >> name;
cout << right<<setw(20)<<"确认您输入的Name:" <<left<<setw(100)<< name << endl;
}
输入Jacky没问题:输入Jacky 输出Jacky
输入Jacky Chan有问题:输入Jacky Chan 输出Jacky
原因:你的名字中间存在空格(cin的结束标识符),所以还没等到读取Chan程序已经结束了。
cin.get()和cin.getline()
可以输入一行,允许除回车外的其他空白存在
cin.get():你的名字+你对象的名字
#include<iostream>
int main() {
using namespace std;
char name1[50];
char name2[50];
cout << "请输入您的Name:\n";
cin.get(name1,50);
cout << "请输入您对象的Name:\n";
cin.get(name2,50);
cout << "您的名字:" << name1 << endl;
cout<<"您对象的名字:" << name2 << endl;
}
系统直接跳过输入对象名字的环节?难道?
实际上是第一个cin.get()结束键入的回车留在了缓冲队列中,当执行第二次cin.get()时读取了该回车终结了读取对象名字的过程
#include<iostream>
int main() {
using namespace std;
char name1[50];
char name2[50];
cout << "请输入您的Name:\n";
cin.get(name1,50);
cin.get();//将残留的回车用于炮灰cin.get()
cout << "请输入您对象的Name:\n";
cin.get(name2,50);
cin.get();//将残留的回车用于炮灰cin.get()
cout << "您的名字:" << name1 << endl;
cout<<"您对象的名字:" << name2 << endl;
}
最终顺利输入并显示了Minamoto Shizuka 的名字
这要归功于中途炮灰cin.get()吸收了缓冲队列中的回车
cin.getline(name1,50);
cin.get();
//等价写法
cin.getline(name1,50).get();
cin.getline():你的名字+你对象的名字
#include<iostream>
int main() {
using namespace std;
char name1[50];
char name2[50];
cout << "请输入您的Name:\n";
cin.getline(name1,50);
cout << "请输入您对象的Name:\n";
cin.getline(name2,50);
cout << "您的名字:" << name1 << endl;
cout<<"您对象的名字:" << name2 << endl;
}
cin.getline()不会残留回车在缓冲队列中,而是将其替换为’\0’补充在了字符串中,所以不会为后续的cin.getline()留下结束标识符
getline对string类的应用
上述的操作都是针对C风格字符数组形式的字符串,ISO/ANSI C++98标准通过添加string类扩展了C++库,因此现在可以用string类型的变量(使用C++的话说是对象)而不是字符数组来存储字符串。
string类和C风格的头函数
#include<string>//string类头函数
string 类头函数
#include<cstring>//C风格头函数
备注:strncat()和strncpy(),它们接受指出目标数组最大允许长度的第三个参数,因此更为安全,但使用它们进一步增加了编写程序的复杂度。
string类好在哪?
string str1;
string str2="panther";
可以将string对象声明为简单变量,而不是数组
cin>>str1;
自动调整长度,更方便,更安全
getline的使用
getline(cin,str1);
#include<iostream>
#include<string>
int main() {
using namespace std;
string str1;
string str2;
cout << "请输入你的名字:" << endl;
getline(cin, str1);
cout << "请输入你对象的名字:" << endl;
getline(cin, str2);
cout << "你的名字:" << str1 << endl;
cout << "你对象的名字:" << str2 << endl;
}
getline,get,cin混用
cin>>name1;//第一个输入
cin>>不能中途输入空格/制表符
cin.get(name1,50);//第一个输入
cin.getline(name2,50);//第一个输入