C++中getline()和get()的方法浅析

所属分类: 软件编程 / C 语言 阅读数: 63
收藏 0 赞 0 分享

最原始的方法:

获取输入流最原始的形式就是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++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多