服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++面向行输入之get()与getline()实例详解

C++面向行输入之get()与getline()实例详解

2022-01-20 14:59Quirkygbl C/C++

在c++里当我们输入一个字符串时习惯用cin,但是cin只能读取一段不含空格的字符串,如果我们需要读取一段包含空格的字符串时,就需要用到getline()或get(),下面这篇文章主要给大家介绍了关于C++面向行输入之get()与getline()的相关资料,需

引入:

?
1
2
3
4
5
6
char a = 's';//这样的语句合法
char b = "s";//不合法
/*
"S"不是字符常量,他表示两个字符(S和\0)组成的字符串。
并且"S"表示的的是字符串所在的内存地址,相当于将一个内存地址赋给b
*/

cin使用空格、制表符、换行符来确定字符串的结束位置,这意味着cin在获取字符数组时只读取一个单词。读取该单词后,cin将该字符串放到该数组中,并自动在结尾添加空字符。

e.g.

?
1
2
3
4
char a[30];
char b[30];
cin>>a;
cin>>b;

当你输入

word1 word2

并敲下回车,cin>>a在word1后检测到空格结束

但程序不会再提示你要输入b

程序把word2留在输入队列中,当cin在输入队列中搜索时,发现了word2,cin读取word2并将它放在b数组中

getline()

读取整行

通过回车键输入的换行符来确定输入结尾

可以使用cin.getline() 该函数有两个参数,第一个参数是用来储存输入行的数组名称,第二个参数是要读取的字符数(如果这个数是20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符)。

getline()成员函数在读取指定数目的字符或遇到换行符时停止读取

!每次读取一行,通过换行符来确定行尾,但不保存换行符,相反,在存储字符串时,用空字符来替换换行符!

get()

读取整行(同getline())

通过回车键输入的换行符来确定输入结尾(同getline())

可以使用cin.get() 与getline()函数接收的参数相同,解释参数的方式也相同。并且都读取到行尾

!但是,get不再读取并丢弃换行符,而是将其留在输入队列中!

解决方法:

可以用不带参数的get()函数来处理换行符

?
1
2
3
cin.get(name,ArSize);
cin.get();
cin.get(dessert,ArSize);

将两个类成员拼接起来

?
1
cin.get(name,ArSize).get();

​ 可以这样操作是因为cin.get(name,ArSize)返回一个cin对象,该对象随后被用来调用get()函数

同样,可以把输入中连续的两行分别读入两个数组中

?
1
cin.getline(name1,ArSize).getline(name2,ArSize);

差异

1、为什么有时候用get而不用getline呢?

老式实现没有getline(),其次get()使输入更仔细

getline()使用起来简单一些,但get()使得检查错误更简单些

2、如何判断get是因为读取了整行而停止还是因为数组已填满?

查看下一个字符,如果是换行符,说明已读取了整行输入,否则,该行中还有其他输入

可能出现问题

1、空行

这两种函数的下一条输入语句将在上一次结束读取的位置开始读取

get()读取空行后设置失效位时,意味着接下来的输入将被阻断,但可以用cin.clear()命令来恢复输入

2、输入的字符串可能比分配的空间长

如果输入行包含的比指定的多,则两种函数会把余下的字符留在输入队列中,而getline()还会设置失效位,并关闭后面的输入

3、混合输入数字和字符串导致的问题

cin输入一个数字类型,按下回车时,换行符留在了输入队列,下一次被getline()等看到换行符,将认为是一个空行,直接赋给数组

解决方法是读取地址之前丢弃换行符

可以用(cin>>year).get()或者cin>>year;get();

关于string使用getline()

C++添加了string类扩展了C++库。因此可以用string类型的变量而不是字符数组来存储字符串。要使用string类,必须包含头文件string。

一般字符数组和string变量使用getline()方法是不同的。

?
1
2
3
4
5
char a[100];
string str;
 
cin.getline(a,100);
getline(cin,str);

cin.getline()这种是句点表示法,函数getline()是istream类的一个类方法。getline(cin,str)没有用到句点表示法,这表明这个getline()不是类方法。它将cin作为参数,指出到哪里去查找输入。另外,也没有指出字符串的长度,因为string对象会根据输入的串的大小自动调整自身的大小。

为什么第二个getline()不是istream的类方法呢。在引入string类之前很久,C++就有了istream类。因此istream的设计考虑到了诸如double和int等基本C++数据类型,但没有考虑到string类型,所以string类中,有处理double,int和其他基本类型的类方法,但没有处理string对象的类方法。

但cin方法也适用与string类对象,这涉及到友元函数,这里先不阐述。

总结

到此这篇关于C++面向行输入之get()与getline()的文章就介绍到这了,更多相关C++面向行输入get()与getline()内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/WZ-1120232314/p/15391435.html

延伸 · 阅读

精彩推荐