C++中getline()和get()的方法浅析
最原始的方法:
获取输入流最原始的形式就是cin>>(type)
,但是这种形式在碰到输入中有空格、制表符或者换行符的时候就会中断,值得注意的是中断后空格、制表符或者换行符还继续留在输入流中。所以最简单的,我们无法使用cin>>(type)
的形式来读取包含空格的字符串,比如输入流中有一句:How are you?使用cin>>(type)
是无法一次性读取出来的,鉴于此,getline()
方法和get()
方法便诞生了。
getline()方法:
getline()
方法读取整行,他使用通过回车键输入的换行符来中断,getline()
方法有两个参数,第一个参数用来存储输入行的数组的名称,第二个参数用来表示读取字符数的大小。getline(name,size)
的方法的使用过程如下:
1. 从输入流中读取一个字符。
2. 如果读取数量达到size-1,将该字符存储到name数组,删除输入流中的该字符,跳转到5。
3. 如果该字符是换行符,删除输入流中的该字符,跳转到5。
4. 否则,将该字符存储到name数组,删除输入流中的该字符,跳转到1。
5. 在name中结尾添加空字符,结束。
下面的代码是使用原始方法和getline()
方法的比较:
#include <iostream> using namespace std; int main() { const int arrayLength = 20; char name1[arrayLength]; char name2[arrayLength]; cout<<"Enter your name1:\n"; cin>>name1; cout<<"Enter your name2:\n"; cin.getline(name2,arrayLength); cout<<"name1: "<<name1<<endl; cout<<"name2: "<<name2<<endl; cin.get(); return 0; }
分析:我们在输入流中输入name1 name2 name3,然后cin>>name1
会读取name1,因为name1后面是空格,但是空格符是保留的,因为在name2中读取的结果是” name2 name3”。
get()方法:
get()
的参数和使用方法与getline()
方法一致,唯一的区别就是get()
方法在碰到换行符是不对输入流中的换行符进行删除。这样我们读取输入流的过程就会产生一个问题,怎么跳过换行符,幸运的是get()
方法提供了一种变体,cin.get()
读取下一个字符,包括换行符,下面的例子掩饰了cin.get(name,size)
和cin.get()
的使用:
#include <iostream> using namespace std; int main() { const int arrayLength = 40; char name1[arrayLength]; cout<<"Enter your name1:\n"; cin.get(name1,arrayLength); cin.get(); cout<<"name1: "<<name1<<endl; cin.get(); return 0; }
运行结果:
getline()和get()方法读取空行的问题:
所谓空行,就是输入流中只有换行符,当getline()
和get()
方法碰到空行时,会设置失效位,使后面所有的输入都中断,我们分析下面的代码:
#include <iostream> using namespace std; int main() { const int arrayLength = 40; char name1[arrayLength]; char name2[arrayLength]; cout<<"Enter your name1:\n"; cin.get(name1,arrayLength); cout<<"Enter your name2:\n"; cin.get(name2,arrayLength); cout<<"name1: "<<name1<<endl; cout<<"name2: "<<name2<<endl; cin.get(); cin.get(); return 0; }
比如我们输入this is name1,回车,这时name1中读取的是this is name1,接下来遇到回车就中断了,在接下来name2读取的时候输入流就成为空行了,这就导致后面的cin.get()
都没有了效果,也就是上面程序总会一闪而过。因为get()
方法碰到了中断导致所有的输入都中断。碰都这种问题的解决方法是在读取输入流之前调用cin.clear()
方法来恢复输入。
#include <iostream> using namespace std; int main() { const int arrayLength = 40; char name1[arrayLength]; char name2[arrayLength]; cout<<"Enter your name1:\n"; cin.get(name1,arrayLength); cout<<"Enter your name2:\n"; cin.get(name2,arrayLength); cout<<"name1: "<<name1<<endl; cout<<"name2: "<<name2<<endl; cin.clear(); cin.get(); cin.get(); return 0; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用PHP能有所帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
栏 目:C语言
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/2010.html
您可能感兴趣的文章
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言没有round函数 round c语言
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10深入Main函数中的参数argc,argv的使用详解
- 01-10APUE笔记之:进程环境详解
- 01-10c++中inline的用法分析
- 01-10如何寻找数组中的第二大数
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10SublimeText编译C开发环境设置
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10C#中split用法实例总结
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 04-02jquery与jsp,用jquery
- 08-05DEDE织梦data目录下的sessions文件夹有什