cin,cin.get(),cin.getline()

本文详细讲解了C++中cin和getline在处理字符输入时的差异,包括结束标识符的理解、cin.get()和cin.getline()的用法,以及为何cin导致输入问题。重点介绍了如何使用getline解决回车残留和字符串存储的优化。
摘要由CSDN通过智能技术生成

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);//第一个输入

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值