问题描述:对于c++,在对键盘输入的字符串进行显示时候,需要注意cin、cout和get等的使用不同上。
1、cin是的输入判断是空格。cin遇“空格”、“TAB”、“回车”都结束的。以下面为例:int main()
{
const int ArSize=20;
char name[ArSize];
char dessert[ArSize];
cout<<"Enter yout name:\n";
cin>>name;
cout<<"Enter your favorite dessert:\n";
cin>>dessert;
cout<<"I have some delicious "<<dessert;
cout<<" for you."<<name<<endl;
return 0;
system("pause");
}
输入名字: Nil king
会发现其直接显示最后的结果,直接跳过了输入"Enter your favorite dessert:"阶段。这是因为,cin将Nil king之间的空格判断为截止符号,分配的时候,将Nil分配给 name,将king分配给了dessert。
注意:键盘是无法输入“空字符”,cin使用空白(空格、制表符和换行符)来定字符串的界。这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。
cin把Nil作为第一个字符串,并将它放到name数组中,这把king留在输入队列中。当cin在输入队列中搜索用户喜欢的甜点时,它发现了队列中的king,因此cin读取king,并将它放到dessert数组中。
另一种方法是进行以行为单位进行读取,使用的是get和getline。两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。
依旧看下例子:
int main()
{
const int ArSize=20;
char name[ArSize];
char dessert[ArSize];
cout<<"Enter yout name:\n";
cin.get(name,7);//读取整行,注意,此处在指定读取字符数的时候不能使用ArSize这样的变量
//cin.get(name,size)若是所设置的字符数参数小于实际输入的参数时,
//cin.getline(name,7);
/*第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。
如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。*/
cout<<"Enter your favorite dessert:\n";
cin>>dessert;
cout<<"I have some delicious "<<dessert;
cout<<" for you."<<name<<endl;
return 0;
system("pause");
}
从该结果可以看出,用cin.get所指定的是读取7个字符,但是输入的liu jie共7个字符,但是所读取的只有liu ji共六个字符。这是因为需要预留一个与结尾添加空字符('\0')。字符'e'被存储在desset中。
对于getline()将丢弃换行符,而get()将换行符保留在输入序列中。采用以下代码进行测试:

从该结果可以看出,直接跳过了cin.getline(dessert,7)这条语句。若是将两者顺序对换以下呢,即输入name的时候采用getline,而dessert的时候采用getline。
cin.getline(name,7);和 cin.get(dessert,7);

分析:
这是因为get(name,7)的时候,保留了换行符,即换行符留在了队列中,第二次调用时【getline()和get()】,看到的第一个字符便是换行符,认为已经达到行尾,而没有发现任何可读取的内容。getline(name,7)的时候,舍弃了换行符。
如果不借助于帮助,get()或是getline()将不能跨过该换行符。
所以,若要第二次使用get(name,7)来操作,需要先使用不带参数的cin.get()来处理换行符。不带任何参数的cin.get()调用读取下一个字符(即使是换行符)的变体。因此可以用它来处理换行符,为读取下一行输入做好准备。
其代码测试如下:

另一种使用get()的方式是将两个类成员函数拼接起来(合并),如下所示
cin.get(name, ArSize).get(); //将两个类成员函数合并
cin.get(name, ArSize)//返回一个cin对象,该对象随后将被用来调用get()函数。
注意:有些C++的老版本没有实现不接受任何参数的get()变体,但实现了接受一个char参数的get()变体。要使用该变体(而不是没有参数get()),需要首先声明一个char变量:
char ch;
cin.get(name, ArSize).get(ch);
对于cin.getline进行类似的分析。以下面为例
int main()
{
const int ArSize=20;
char name[ArSize];
char dessert[ArSize];
char d[ArSize];
cout<<"Enter yout name:\n";
cin.get(name,7);//
//cin.getline(name,7);
/*第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。
如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。*/
cout<<"Enter your favorite dessert:\n";
//cin.get();
cin.getline(dessert,7);
//cin.getline(dessert,20);
cout<<"I have some delicious "<<dessert;
cout<<" for you."<<name<<endl;
return 0;
system("pause");
}
其结果如下图:从该结果可以看出,直接跳过了cin.getline(dessert,7)这条语句。若是将两者顺序对换以下呢,即输入name的时候采用getline,而dessert的时候采用getline。
cin.getline(name,7);和 cin.get(dessert,7);
int main()
{
const int ArSize=20;
char name[ArSize];
char dessert[ArSize];
char d[ArSize];
cout<<"Enter yout name:\n";
cin.getline(name,7);//
cout<<"Enter your favorite dessert:\n";
//cin.get();
cin.get(dessert,7);
//cin.getline(dessert,20);
cout<<"I have some delicious "<<dessert;
cout<<" for you."<<name<<endl;
//可能是由于getline丢弃了换行符
return 0;
system("pause");
}
其结果如下图所示:分析:
这是因为get(name,7)的时候,保留了换行符,即换行符留在了队列中,第二次调用时【getline()和get()】,看到的第一个字符便是换行符,认为已经达到行尾,而没有发现任何可读取的内容。getline(name,7)的时候,舍弃了换行符。
如果不借助于帮助,get()或是getline()将不能跨过该换行符。
所以,若要第二次使用get(name,7)来操作,需要先使用不带参数的cin.get()来处理换行符。不带任何参数的cin.get()调用读取下一个字符(即使是换行符)的变体。因此可以用它来处理换行符,为读取下一行输入做好准备。
其代码测试如下:
int main()
{
const int ArSize=20;
char name[ArSize];
char dessert[ArSize];
char d[ArSize];
cout<<"Enter yout name:\n";
cin.get(name,7);//
cout<<"Enter your favorite dessert:\n";
cin.get();
cin.getline(dessert,7);
//cin.getline(dessert,20);
cout<<"I have some delicious "<<dessert;
cout<<" for you."<<name<<endl;
return 0;
}
其测试结果:另一种使用get()的方式是将两个类成员函数拼接起来(合并),如下所示
cin.get(name, ArSize).get(); //将两个类成员函数合并
cin.get(name, ArSize)//返回一个cin对象,该对象随后将被用来调用get()函数。
注意:有些C++的老版本没有实现不接受任何参数的get()变体,但实现了接受一个char参数的get()变体。要使用该变体(而不是没有参数get()),需要首先声明一个char变量:
char ch;
cin.get(name, ArSize).get(ch);
对于cin.getline进行类似的分析。以下面为例
int main()
{
const int ArSize=20;
char name[ArSize];
char dessert[ArSize];
cout<<"Enter yout name:\n";
cin.getline(name,7);//读取整行,注意,此处在指定读取字符数的时候不能使用ArSize这样的变量
//cin.get(name,size)若是所设置的字符数参数小于实际输入的参数时,
//cin.getline(name,7);
/*第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。
如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。*/
cout<<"Enter your favorite dessert:\n";
cin>>dessert;
cout<<"I have some delicious "<<dessert;
cout<<" for you."<<name<<endl;
return 0;
system("pause");
}
其输出的结果:通过与上一张图对比,发现“e”并没有存储到dessert这个数组中。
这是因为上述代码中的输入是7个字符,而name数组仅仅可以接收6个字符。这就发生了溢出!
若将其输入改为 liu ji,则可以输入dessert。其结果如下图:

这说明cin.getline的溢出,在一定程度上可以视为错误,从键盘输入溢出的部分并没有存储在dessert中。会直接跳过cin>>dessert,采用cin.getline也是会被跳过的,设置失效位,并关闭后面的输入。在溢出的情况下,不可输入!那怎么使得,溢出不对输入产生影响呢?可以采取cin.clear()命令恢复输入。
测试代码如下:

实现可输入的恢复!
这是因为上述代码中的输入是7个字符,而name数组仅仅可以接收6个字符。这就发生了溢出!
若将其输入改为 liu ji,则可以输入dessert。其结果如下图:
这说明cin.getline的溢出,在一定程度上可以视为错误,从键盘输入溢出的部分并没有存储在dessert中。会直接跳过cin>>dessert,采用cin.getline也是会被跳过的,设置失效位,并关闭后面的输入。在溢出的情况下,不可输入!那怎么使得,溢出不对输入产生影响呢?可以采取cin.clear()命令恢复输入。
测试代码如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
const int ArSize=20;
char name[ArSize];
char dessert[ArSize];
cout<<"Enter yout name:\n";
cin.getline(name,7);
cin.clear();
cout<<"Enter your favorite dessert:\n";
cin.get(dessert,20);
cout<<"I have some delicious "<<dessert;
cout<<" for you."<<name<<endl;
return 0;
}
结果图:实现可输入的恢复!