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);
得到了正确的结果: