C++ getline()与get()方法初探

发表于:2016-10-26 10:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:SauronKing    来源:51Testing软件测试网采编

  前言
  作为C++获取输入流的方法,几乎在任何一本资料书上,getline()方法和get()方法都作为入门级的方法进行讲述,即便如此,笔者在学习C++的过程中仍经常忘记这二者的使用要点,可能也有C++的初学者对这两个方法还心存疑虑,本篇文章就这两个方法的使用进行简要阐述。标题的初探二字已经表示本文只是以学习笔记的形式进行记录,不是在深层次上对二者进行分析。
  最原始的方法:
  获取输入流最原始的形式就是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;
}
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号