【新知识】使用getline()与get()来进行输入

3 篇文章 1 订阅
订阅专栏

        本文使用代码案例来自《C++ Primer Plus》(第六版)一书,并对书中原代码稍加改写以方便阅读。这篇文章相当于个人的学习笔记,会充满各种不成熟的想法,所以如果有错误,希望有大佬可以斧正。

一、输入字符串时存在的一些问题

        使用cin输入字符串时,cin会把空白(即空格、制表符和换行符)当作字符串结束的位置,这就导致会出现一些问题,如以下代码演示:

#include <iostream>
using namespace std;
int main(){
    char name[20];    //客人名字
    char dessert[20];    //客人所点的甜品名
    cout << "请输入您的姓名:\n";
    cin >> name;
    cout << "请输入您想点的甜品名:\n";
    cin >> dessert;
    cout << "我为您提供了一些" << dessert << "," << name << "先生" <<endl;
    return 0;
}

        以下是程序编译的结果。

        很容易发现,cin把John和smith之间的空格作为停止输入的一个标志,所以cin把John给了name,然后又把smith给了dessert,所以发生了这样滑稽的事情。

        还有一个问题,那就是name和dessert都是长度为20个元素的数组,如果客人或者甜品的名字比较鬼畜的话,可能就会导致数组越界的问题。

        综上所述,必须寻求一种新的方法来输入并储存字符串,来保证程序的正常运行,同时提高程序的安全性。

二、getline()函数

        由于上面所介绍的cin的特性,我们必须使用一种函数,这种函数可以直接读取一整行的输入,于是我们得到了istream类中的另外两种类成员函数:getline()和get()。由于本人尚未学C++中关于“类”的相关知识,所以暂时按下不表。

        首先先说getline()函数。getline()函数与cin不同,它会直接读取整行,并以换行符为结尾。要使用这种方法,可以使用cin.getline(),该函数有两个参数,即用于储存字符串的数组名称和要读取的字符数,如cin.getline(name,20),这样就会把输入的字符中的前19位储存入name中,同时把一个\0(空字符)作为第二十位储存入name中。

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char name[30];/*客人名字*/ char dessert[30];    //客人所点的甜品名
int main(){
    cout << "请输入您的姓名:\n";
    cin.getline(name,20);
    cout << "请输入您想点的甜品名:\n";
    cin.getline(dessert,20);
    cout << "我为您提供了一些" << dessert << "," << name << "先生" <<endl;
    system("pause");
    return 0;
}

  

        但是如果我们把name和dessert的长度改为2,然后再输入这么长的名字,会有什么效果呢?

        现在让我们在中间插入两句cout语句,看看name和dessert在程序运行时究竟发生了什么变化

    cout << "请输入您的姓名:\n";
    cin.getline(name,20);
    cout << name << endl;
    cout << "请输入您想点的甜品名:\n";
    cin.getline(dessert,20);
    cout << name << '\t' << strlen(name) << '\t' << dessert << '\t' << strlen(dessert) << endl;
    cout << "我为您提供了一些" << dessert << "," << name << "先生" <<endl;

          

         可以发现,第二句cin.getline()居然把ZNTM的前两个字符一并储存到dessert里面了,这是否与一开始规定的name长度为2有关?所以我把2改为了3试了试,结果果然如此。

  

        这种情况出现的原因在下面会说。

        本人在实际使用getline()的过程中发现一个很奇怪的现象,那就是如果储存的数据类型为char时,可以用cin.getline(变量,长度);而类型为string时,只能使用getline(cin,变量)。同样由于水平所限,暂时不清楚具体原理,只好先作为经验记录下来。

三、get()函数

        get()和getline()一样,有许多变体类型,其中一种和cin.getline()一样,即cin.get()。与带参数的cin.getline()不同的是,带参数的cin.get()不会丢掉此行输入的换行符,所以如果连续调用两个get()的话,会导致换行符被作为第一个字符读取,从而使得get()误以为输入已经结束,结果就是什么都没有输入进去。

        解决方法也很简单,可以使用get的另一种变体,即不带参量的cin.get()来读取下一个字符(即便是个换行符),所以可以这样写:

//第一种方式
cin.get(name,20);
cin.get();
cin.get(dessert,20);

//第二种方式
cin.get(name,20).get();

          同理,可以使用cin.getline(name,20).getline(dessert,20)来实现同时读取两个变量。

        get()相比起getline()有着更为细致的优势。比如将一行字符串填入数组时,如何才能知道停止读取是由于数组越界还是字符串已全部输入?只需要读取下一个字符,判断是否是换行符。如果是,那就说明已经输入完毕;如果不是,那就说明数组越界了。但是相比起来,getline()使用起来更简单一些。

四、可能存在的一些问题

        1.如果读取空行时会怎么样?正常情况下,两个连续的get()或getline()语句,如果前者输入已经结束,那么后者会在前者结束的地方继续开始读取。但是如果读取到了空行,那么这两个函数会设置“失效位”,这玩意会阻断接下来的输入,但是可以使用cin.clear()来恢复输入。

        2.如果输入的字符串长度超过数组长度会怎么样?上文中已经演示过这种情况,前两个字符会被储存在第二个数组中。这种情况背后的原理就是,如果输入的字符串长度超过数组长度的情况发生,getline()和get()会把余下的字符留在输入队列中,而getline()还会进一步设置一个失效位来阻断输入。

        3.如何解释以下程序会在输入年份后闪退?

#include <iostream>
using namespace std;
int main(){
    int year;
    cout << "你房子是哪一年建的:" << endl;
    cin >> year;
    cout << "你房子地址在哪里:" << endl;
    char address[80];
    cin.getline(address,80);
    cout << "建成年份: " << year << '\n' << "地址: " << address << endl; 
    system("pause");
    return 0;
}

        原因就是,cin读取年份后,将回车键生成的换行符留在了输入队列中,而cin.getline()看到换行符后,便以为输入已经结束,所以程序关闭。解决方法如上文所述,可以在cin后面加一个cin.get(),也可以直接写(cin >> year).get()。

 

cin,cin.get,cin.getline等函数深入分析[参照].pdf
10-11
C++ 中的 cin 函数是一个输入流对象,它提供了多种成员函数和重载的操作符来实现输入操作。然而,很多初学者认为 cin 函数是一个很简单的函数,但实际上,它有很多需要了解的知识点,否则,在使用的时候很可能会出...
getline全面详解(手必看)
m0_74383813的博客
10-13 1万+
函数后,输入流的指针会自动移动到下一行的开头(如果是默认的分割符'\n'),准备读取下一行文本。是 C++ 标准库中的一个函数,用于从输入流中读取。等不同类型的输入流中读取数据。标准输入、文件流、字符串流。
getline使用详解
m0_72542983的博客
02-01 2万+
getline函数的介绍
getline
最新发布
FHKHH的博客
07-17 467
getlineC++ 标准库中的一个函数,用于从输入流中读取一行文本。
getline()的用法详解
pangyou3s的博客
01-31 1万+
getline()的用法详解
getline()和get()的使用区别
weixin_30662849的博客
07-22 1634
一、getline和get()的使用区别: 首先这两个函数都读取下一行输入,直到到达换行符;但是getline()函数会丢弃换行符,而get()将换行符保留在输入序列中 二、getline()函数的使用方法: getline()函数读取整行,它使用通过回车输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数,第一个参数是用来存储输入行的数组的名称,...
c++ getline()详解
阿华的保温杯的博客
12-06 1万+
etline()函数在c++中有两种用法,第一种定义在$$头文件中,第二种定义在$头文件中。getline()在这两种用法中都是用于读入一行字符串,可以带空格等特殊字符,在第二种用法中getline的第一个参数传的是`流`,比如:cin和stringstream
C++输入输出注意事项总结
09-04
C++编程中,输入输出(I/O)是程序与用户交互的基础,理解其工作原理和注意事项至关重要。本文将深入探讨C++中的输入输出机制,特别是针对字符串、字符数组和单个字符的处理。 首先,我们来看`string`类。在使用`...
标准的输入输出流和文件流.doc
01-05
标准输入输出流可以使用流操作符来进行输入输出操作。例如,在测试一中,我们使用cin>>a>>str来输入整数和字符串,然后使用cout;和cout;来输出结果。 二、文件流 文件流是C++中的一种输入输出方式,用于读写文件。...
get_next_line
03-22
在这个场景中,`get_next_line` 函数可能是用户自定义的一个实现,用于替代 C 标准库中的 `fgets` 或 `getline` 函数,以满足特定的需求,比如更高效地处理输入数据,或者提供更灵活的读取行为。 在 C 语言中,读取...
getline函数和get函数的区别
Benboerba11的博客
07-31 639
C++中的getline函数与get函数的区别
C++的get()函数与getline()函数使用详解
轻松学C语言
09-20 1万+
点击蓝字关注我们来源自网络,侵删一.C++的get()函数使用详解1.C++ get()函数get()函数是cin输入流对象的成员函数,它有3种形式:无参数的;有一个参数的;有3个参数的。1) 无参数的其调用形式为cin.get()用来从指定的输入流中提取一个字符(包括空白字符),函数的返回值就是读入的字符。若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File),一般...
getline使用
lzh的博客
02-23 1万+
1、cin.get()   1)用来获取输入的第一个字符   例: char c; cin.get(c); cout << ch; 输入 输出 abcd a   2)用于舍弃输入流的不需要的字符,如下面的getline函数在使用之前就需要使用   例:   注意:输入的时候回车符会占一个字符,输出会少一个字符 char a[5]; cin.get(a,5...
getline()函数与get()函数
ASDF的博客
04-11 657
1.getline() #include<string> getline()的原型是istream& getline ( istream &is , string &str , char delim ); 其中 istream &is 表示一个输入流,譬如cin; string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以); char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n
getline函数介绍
weixin_61857742的博客
04-24 2万+
今天,小编将为大家讲解有关getline函数的相关知识。 目录 一.cin.getline(char* s, streamsize n, char delim) 二.getline(istream& is, string& str, char delim) 提到getline那就不得不提cin。 相比于cin,getline的优点就是在输入字符串的时候能够输入空格。而cin则会在输入空格时自动结束输入。这一点与c语言中的scanf和gets函数很像。 一.cin.getlin
c语言getline作用,C++getline()的用法详解
weixin_42400619的博客
05-17 8270
getline()用法getlineC++标准库函数;它有两种形式,一种是头文件< istream >中输入流成员函数;一种在头文件< string >中普通函数;它遇到以下情况发生会导致生成的本字符串结束:(1)到文件结束,(2)遇到函数的定界符,(3)输入达到最大限度。输入流成员函数getline()函数语法结构:在< istream >中的getline...
getline详解
tanjunming2020的博客
09-16 2956
c++中,我们可以使用cin来输入字符串。但是当它读取数据时读取到空格,就会停止读取。所以,当我们想读取整一行且该行可能出现空格时,cin就不适用了。我们可以使用getchar()来一个一个字符读取,但这样会有些麻烦。我们可以用getline()这个函数可以读取整行,包括其中的空格。但是,如果上一行遗留了一个换行,则getline会读取换行而不是读取下一行。在输入中,空格之后的部分没有被读取。那么,我们该如何解决这类问题呢?所以要用getchar()吃掉接下来的换行。
getline()的使用详解
热门推荐
那年聪聪
03-02 13万+
getline()的使用详解
getline与get
08-21
getline和get是C++中用于读取输入的两个函数。它们的主要区别在于读取输入的方式和处理换行符的方式。 引用中提到,当储存的数据类型为char时,可以使用cin.getline(变量,长度)来读取输入。而当数据类型为string时,则需要使用getline(cin,变量)来读取输入。 引用进一步解释了get()函数的用法。与带参数的cin.getline()不同,带参数的cin.get()不会丢掉此行输入的换行符。这意味着,如果连续调用两个get()函数,会导致换行符被作为第一个字符读取,从而使得get()误以为输入已经结束,结果就是什么都没有输入进去。 另外,引用提到,可以使用连续的cin.getline()来实现同时读取多个变量的功能。 综上所述,getline和get函数都可以用于读取输入,但它们的使用方式和处理换行符的方式略有不同。要根据具体的需求和数据类型选择适合的函数来进行输入操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【知识使用getline()与get()来进行输入](https://blog.csdn.net/Assassin_141/article/details/126736195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
写文章

热门文章

  • 【新知识】使用getline()与get()来进行输入 1233
  • 【学习进度】截至2022.9.6,已学习的C++知识 1026
  • 【新知识】初涉函数——C++的编程模块 546
  • 关于个人博客的导言 104

分类专栏

  • C++入门 3篇

最新评论

  • 【新知识】使用getline()与get()来进行输入

    拔刀能留住落樱吗、: 真的有认真看完!!!!!!!!!!!!!!!!!

  • 【新知识】初涉函数——C++的编程模块

    Assassin_141: 我超,居然是机器人,现在AI这么恐怖吗

  • 【新知识】初涉函数——C++的编程模块

    Assassin_141: 居然真的有人愿意认真看完,谢谢!!!

  • 【新知识】初涉函数——C++的编程模块

    CSDN-Ada助手: 你的文章质量不错,值得学习!但还有一点小瑕疵,具体如下:(1)增加内容的多样性(例如使用标准目录、标题、图片、链接、表格等元素);(2)增加条理清晰的目录;(3)使用更多的站内链接。

大家在看

  • uniapp自定义Tabbar教程
  • python画图|把X轴标签移动到图像顶端
  • 限和最长子序列
  • GitHub连接方式
  • STM32——硬件IIC和软件IIC 47

最新文章

  • 【新知识】初涉函数——C++的编程模块
  • 【学习进度】截至2022.9.6,已学习的C++知识
  • 关于个人博客的导言
2022年4篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家新乡卡通玻璃钢雕塑公司东营玻璃钢仿真动物雕塑玻璃钢小品动物雕塑深圳美陈商场有哪些沈阳玻璃钢商场美陈嘉兴玻璃钢雕塑找哪家上海艺术商场美陈制造柳州玻璃钢雕塑玻璃钢雕塑仿真黄牛广州玻璃钢老鹰雕塑商场服装店铺秋季美陈江门led发光玻璃钢雕塑定做四会玻璃钢雕塑沈阳户外玻璃钢花盆厂三门峡商场美陈植物墙玻璃钢雕塑验收标准天津商场圣诞布置美陈大余玻璃钢雕塑湖南动物玻璃钢雕塑设计南京景区玻璃钢雕塑价格上海室内商场美陈哪里买广州市白云区玻璃钢雕塑厂呼和浩特卡通玻璃钢雕塑安装山东超市商场美陈销售厂家商场春天美陈装饰南山玻璃钢卡通雕塑杭州富阳区商场美陈布置定制玻璃钢雕塑 泉州潮州玻璃钢人物雕塑制作安庆街道玻璃钢花盆香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化