C++基础学习系列-1-字符串的读取和显示

发布时间:2016-12-10 17:10:54 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"C++基础学习系列-1-字符串的读取和显示",主要涉及到C++基础学习系列-1-字符串的读取和显示方面的内容,对于C++基础学习系列-1-字符串的读取和显示感兴趣的同学可以参考一下。

问题描述:对于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()将换行符保留在输入序列中。采用以下代码进行测试: 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()命令恢复输入。 测试代码如下: #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; }结果图: 实现可输入的恢复!

上一篇:10054 - The Necklace(欧拉回路+回路打印)
下一篇:浅谈Linux用户权限管理之三(文件与权限的设定)

相关文章

相关评论