C++学习第3课

cin中getline和get类的使用:

cin的小漏洞1:

cin从键盘获取输入的时候,会忽略空格后输入的字符:

 

原因:cin使用空白(空格符、制表符、换行符)来确定字符串的结束位置,也就是说使用cin进行字符数组输入时只会读取一个单词

cin的小漏洞2:

cin把sgdkjhag作为第一个字符串,并把它放到fname数组中,并把jkhfdjkash留到了输入队列中。当cin在输入队列中搜索last name时,它发现了jkhfdjkash,因此cin读取jkhfdjkash,并将它放到了lname数组中:

 

为了使程序读取并存储完整的语句,可以使用getline()读取一行字符串输入 :

因此,将cin >> fname;修改为cin.getline(fname,50);

get()用法的小漏洞:

连续用两次get(),会导致前一个输入的回车被当做第二次输入的内容,

代码粘贴如下:

void showIfo(){
	using namespace std;
	char fname[50];
	char lname[30];
	char score;
	int age;
	
	cout << "What is your first name? ";
//	cin >> fname; 
//	cin.getline(fname,50);
	cin.get(fname,50);
	cout << "What is your last name? ";
//	cin.getline(lname,30);
	cin.get(lname,30);
//	getline(cin,lname);
	cout << "What letter grade do you deserve? ";
	cin >> score;
	cout << "What is your age? ";
	cin >> age;
	cout << "Name:" << fname << "," << lname << endl;
	cout << "Grade:" << (char)(score+1) << endl;
	cout << "Age:" << age;
	
} 

原因: get不读取不第七换行符,而是将其继续留在输入队列中,因此第二次调用时看到的第一个字符便是换行符,因此get()认为已经 到达行尾,而没有发现任何可读取的内容

以上述代码为例,假设我们连续两次调用get(): 

cin.get(fname,50);
cin.get(lname,30);

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个 字符便是换行符。因此get()认为已经到达行尾,而没有发现任何可读取的内容。

因此,将上述代码改为下述代码可以得到想要的结果:

cin.get(fname,50);
cin.get();
cin.get(lname,30);

 或者使用另外一种方式将两个类成员函数拼接起来:

cin.get(fname, 50).get();

再或者直接使用getline() 

cin.getline(fname,50);
cin.getline(lname,30);

 

 得到了正确的结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值