c++中字符串的输入
2016-05-05 16:30
337 查看
之前对c++的学习很浅显 以至于觉得输入就是用cin,最近学习了primer plus 才知道关于字符串的输入没有我想的那么简单
如果按照之前的理解 会存在问题的 贴上一段代码
程序运行情况如下
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 空格和其他问题
如果按照之前的理解 会存在问题的 贴上一段代码
#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 空格和其他问题
相关文章推荐
- C++实验5--项目1:数组分离
- c++构造函数 对象初始化
- C++ new的nothrow关键字和new_handler用法
- leetcode笔记:Excel Sheet Column Number
- nyoj17 单调递增最长子序列
- <<Effective C++>> 读书笔记6: 继承与面向对象设计
- C++去除文件名中的空格
- C++ 单链表基本操作分析与实现
- C++命名空间详解
- int 与 string 相互转换
- C++11系列-常量表达式
- C++11系列-区间迭代
- C++11系列-lambda函数
- C++11系列-改进的类型推导:auto、decltype和新的函数语法
- C++11系列-什么是C++11
- c语言中变量作用域的区别
- c++ getline
- C++写入txt文件方法
- C++中的随机数函数
- C++文件读写详解(ofstream,ifstream,fstream)