1、面向单词的输入
int main(){
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cin>>name;
cin>>dessert;
cout<<"name is "<<name;
cout<<"dessert is"<<dessert;
system("pause");
return 0;
}
上面的代码若输入姓名时直接输入Alistair Dreeb时,则会直接跳过第二个输入,最后name数组中的内容是Alistair,dessert数组中的内容是Dreeb。
原因是cin使用空白(空格、制表符、换行符)来确定字符串的结束位置,这就意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。
2、面向行的输入
istream中的类提供了面向行的类成员函数getline()和get()
这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。
getline()的使用
int main(){
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cin.getline(name,ArSize);//第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数
cin.getline(dessert,ArSize);//如第二个参数是20,函数最多读取19个字符,应为要存储空字符
cout<<"name is "<<name;
cout<<"dessert is"<<dessert;
system("pause");
return 0;
}
此时函数都可以达到预想的效果。getline()函数每次读取一行。它通过换行符来确定行尾,但不保存换行符。相反,在存储字符串时,它用空字符来替换换行符。
get()的使用
int main(){
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cin.get(name,ArSize).get();
cin.get(dessert,ArSize).get();
cout<<"name is "<<name;
cout<<"dessert is"<<dessert;
system("pause");
return 0;
}
这段代码的作用和getline的作用完全一样。
但是,由于get()读取字符后,换行符还在输入序列中,因此需要借助cin.get()可读取下一个字符(即使是换行符),因此可使用它来处理换行符,为读取下一行做准备。
可以理解为cin.get()的作用就是跳过一个换行符。
3、消除不良输入
int a=0;
while(!(cin>>a))
{
cin.clear();//重置输入,如果没有这条语句,程序将拒绝继续读取输入。
while(cin.get()!='\n')//cin.get()用来读取行尾之前的所有输入,从而删除这一行中的错误输入
continue;
cont<<"please enter a number:";//告诉用户,应输入一个数字
}