您的位置:首页 > 编程语言 > C语言/C++

c++中字符串的输入

2016-05-05 16:30 337 查看
之前对c++的学习很浅显 以至于觉得输入就是用cin,最近学习了primer plus 才知道关于字符串的输入没有我想的那么简单

如果按照之前的理解 会存在问题的 贴上一段代码

#include<iostream>
using namespace std;
int main()
{
const int arsize=20;
char name[arsize];
char dessert[arsize];

cout<<"enter your name:\n";
cin>>name;
cout<<"enter you favorite dessert:\n";
cin>>dessert;
cout<<"i have some delicious "<<dessert;
cout<<"for you"<<name<<endl;
return 0;
}


程序运行情况如下

enter your name :

alistair dreeb

enter your favorite dessert:

i have some delicious dreeb for you ,alistair

很明显 并没有输入喜欢的甜点 但是程序已经结束了

那么问题来了 cin是怎么确定已完成的字符串输入呢?答案是cin使用空白(空格 制表符和换行符)来确定字符串的结束位置 这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将字符串放在数组中,并自动在结尾添加空字符。

这个例子的实际结果是:cin把alistair作为第一个字符串,并把它放在name数组中,这把dreeb留在了输入队列中,当cin在输入队列搜索用户喜欢的甜点时,它发现了的dreeb 因此cin读取dreeb 并把它放在了dessert数组中。

此外数组的长度也不好控制 不能确保20够用。

为了解决cin每次只能读取一个单词 iostream中的类提供了一些面向行的类成员函数:getline()和get() 这两个函数都读取一行输入 直到换行符 然而 getline()将保留换行符 而get()将换行符保留在输入序列中

1.getline()

要调用这种方法 cin.getline() 该函数有两个参数 第一个参数是用来存储输入行的数组名称,第二个参数是要读取的字符数(如果参数为20,则函数最多读取19 余下空间用来存储空字符) 例如 cin.getline(name,20) getline()函数每次读取一行 它通过换行符确定行尾 但不保存换行符 相反 在存储字符串时 它用空字符来替换换行符。

2.get()

get()的工作方式与getline()相似,他们接受的参数相同 解释参数的方式也相同 并且都读到行尾。 但get()并不在读取并丢弃换行符 而是将其留在输入队列中 假设我们两次调用get()

cin.get(name,arsize);

cin.get(dessert,arsize);

由于第一次调用后 换行符留在输入队列 因此第二次调用看到的第一个字符就是换行符 如果不借用帮助 get()将不能跨过该换行符 可以借助不带任何参数的get()来解决这个问题 如下

cin.get(name,arsize);

cin.get();

cin.get(dessert,arsize);

另外一种使用get()的方式是将两个类成员函数拼接起来 如下

cin.get(name,arsixe).get();

之所以可以这么做 是由于cin.get(name zrsize)返回一个cin对象 该对象随后调用get()函数;

同样 下面的函数也可以

cin.getline(name1,arsize).getline(name2,arsize);

3 空格和其他问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: