C++中cin.get()和cin.getline()的用法以及区别_weixin_44013706的博客-程序员秘密

技术标签: C++  

今天在学习C++的时候对getline()函数和get()函数有点蒙,特地去找了些资料,加上自己上机实验了一些,整理了一些二者的区别。

首先二者都是可以从输入流中获得字符,get()函数可以不设置参数,如char ch=cin.get();

也可以设置一个参数,这个参数为一个字符变量例如char ch;
cin.get(ch);//表示把从输入流中得到的字符赋值给ch变量 。

上面这两个用法与c语言中的getchar()相似,这里不做赘述。

下面来说一下 get()函数 带两个参数或者三个参数的用法,两个参数时调用形式为:

cin.get(指针名或数组名,获得字符的数量);

表示把获得的字符付给该数组或字符指针,例如:

`char ch[20];

cin.get(ch,15);`//把字符串赋值给数组,并在结尾加一个’\0’;

三个参数的用法与两个参数的用法相似,只不过多了一个参数终止字符;调用形式为cin.get(指针名或数组名,字符个数,终止字符);例如:


char ch[20];

cin.get(ch,15,'/');



表示把从输入流中获得的15个字符赋给ch数组,如果这期间遇到了终止字符’/’,则只把终止字符前面的字符赋值给数组。

getline()函数调用形式与get()函数的后两种用法相似,即也是从输入流中获得指定长度字符,赋值给数组或字符指针。

那二者的区别在于哪呢?先上一段代码


#include"iostream"
using namespace std;

int main()

{

    char ch[20];

    char *pt = ch;//指针指向该数组

    cin.getline(pt,15,'/');//注意结尾会自动加'\0'

    cout<< "the first part is:" << pt << endl;
    cin.getline(pt,15, '/');

    cout<< "the second part is:" << pt << endl;

    system("pause");

    return 0;

}

上面这段代码很简单,我们来试验一下,输入 I am a boy,/I am a girl./ 时会是什么样子呢?
运行结果
可以看到,遇到了终止字符就停止录入字符了,下面我们再换成cin.get()函数试试呢;
代码如下



#include"iostream"
using namespace std;
int main()

{

    char ch[20];

    char *pt = ch;//指针指向该数组

    cin.get(pt,15,'/');//注意结尾会自动加'\0'

    cout<< "the first part is:" << pt << endl;
    cin.get(pt,15, '/');
    cout<< "the second part is:" << pt << endl;

    system("pause");

    return 0;

}


同样输入 I am a boy,/I am a girl./ 来运行一下试试,结果:
运行结果
我们发现第二部分没有输出结果,这是怎么回事呢,为了弄清楚后面的字符串是不是还在,我修改了一下代码,如下:



#include"include.h"

int main()

{

    char ch[20];

    char *pt = ch;

    string str;

    cin.get(pt,15,'/');

    cout<< "the first part is:" << pt << endl;

    cin>> str;
    cout<< str << endl;
    cin>> str;
    cout<< str << endl;
    cin>> str;
    cout<< str << endl;
    cin>> str;
    cout<< str << endl;
    //cin.get(pt, 15, '/');
    //cout << "the second part is:" <<pt << endl;
    system("pause");
    return 0;

}


把原来代码中后面的get()函数改成了 cin>>str;cout<<str<<endl; ,结果发现运行结果为
在这里插入图片描述

结果很明显,也就是说前面get()函数录入到终止字符后, 控制输入流的指针指在了终止字符,
所以之后用cin>>str会把/也一同录入,而getline函数没有这种现象是因为getline函数运行遇到终止字符后指针位置在终止字符后面;验证很简单,只要执行第一个get()函数之后用一个cin.ignore()函数向后跳个字符,此时使用第二个get()函数就正常了。

以上便是二者的一个很重要的区别了。
还有,get()函数在输入数组超界时会把后面的字符仍然放在输入流中,而getline函数()则会舍弃掉后面的字符,如果读者有兴趣可以自行运行一下试试。

抖个机灵,有说错的地方欢迎各位大佬指正,溜了。。。。。。。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44013706/article/details/88854887

智能推荐

Linux基础入门-2_linux自动点击软件_Half-up的博客-程序员秘密

Linux的安装#Linux云服务器(不用安装等麻烦过程)自己安装服务器还是麻烦了些,现在一般都推荐大家使用云服务器,比较方便,价格也不贵。目前市场上的云服务器很多,这边比较下腾讯云跟阿里云的服务器优惠活动,现在看来腾讯云性价比会高一些。登陆腾讯云控制台,查看已购买的服务器:2 使用腾讯云服务器前,我们需要先创建一个 SSH 密钥,点击左侧的 SSH 密钥 (使用密钥登录比密码更安全)...

Linux下查看Raid磁盘阵列信息的方法_u011057424的博客-程序员秘密

Linux下查看软、硬raid信息的方法软件raid:只能通过Linux系统本身来查看cat /proc/mdstat可以看到raid级别,状态等信息。硬件raid: 最佳的办法是通过已安装的raid厂商的管理工具来查看,有cmdline,也有图形界面。如Adaptec公司的硬件卡就可以通过下面的命令进行查看:# /usr/dpt/raidutil -L a

SpringCloud之声明式服务调用Feign丢失在网关添加的Request Headers数据_小达哥的垃圾桶的博客-程序员秘密

场景:项目在网关Zuul中对请求Request进行了处理,(包括添加修改参数、添加addZuulRequestHeader等)。问题:在不经过Feign声明式服务调用时发现不了问题,参数、RequestHeader都没有丢失,可正常调用;可当服务A调用了服务B时,服务B的Request就把之前网关Zuul做的处理数据都丢失了。解决:在子服务里添加如下代码,防止丢失处理过后的Reques...

html细线表格_html 细线表格_大斧滴熊的博客-程序员秘密

&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt;&lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;title&gt;Doc

Druid.jar包_weixin_30565327的博客-程序员秘密

首先了解一下,什么是Druid. Druid是Java语言中最好的数据库连接池,它能够提供强大的监控和扩展功能。 Druid是一个JDBC组件,它包括三部分: 1)DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 2)DruidDataSource 高效可管理的数据库连接池。 3)SQLParser Druid可以做什么呢,官网做...

获取keyWindow_joker_wlk的博客-程序员秘密

UIWindow *window = [UIApplication sharedApplication].delegate.window;

随便推点

BCB控件安装详细说明_bcb安装openglap控件_Lixinag的博客-程序员秘密

第一步 首先file | close All其次file | open project再次寻找要添加的后缀为.bpk的文件双击 ,并把当前的路径记住在出现的对话框中 先选中compile,再选中install第二步菜单中tools | environment options | environment variables | user overrides  | new | 出现对话框,上面写变

Windows10下安装MySQL5.0详细教程_唐传林的博客-程序员秘密

Windows10下安装MySQL5.0详细教程想记录一下这些步骤,以防时间久了忘记。电脑环境:windows10教育版 64位 (OS内部版本:16299.125)安装步骤:1、到MySQL官网下载MySQL5.0安装程序。 注意:MySQL官网有好多个版本,本教程以MySQL5.0为例子进行介绍。 需要MySQL其他版本点击这里 2、解压后双击打开“Set...

的计算机课小说,6 计算机课_反正我不慌哈的博客-程序员秘密

最新网址:www.wurexs.com 大一生活就这么无厘头地开始了。从小学开始,我都比较喜欢上第一堂课。为什么呢?因为老师都不会讲正题,不讲正题就不用动脑子。尤其是专业课上,老师把德语是个什么样的语言、他们在德国遇到了什么有趣的事还有王家短李家长的琐事足足讲了两个小时。我实在很佩服老师的倾吐欲,恨不得在下面说个“顶”或者是“马克”“记号”之类的插上一脚,以表明自...

【313】python 中 print 函数用法总结_weixin_34148508的博客-程序员秘密

参考:python 中 print 函数用法总结参考:Python print() 函数(菜鸟教程)参考:Python 3 print 函数用法总结目录:字符串和数值类型变量格式化输出  print() 方法用于打印输出,最常见的一个函数。print 在 Python3.x 是一个函数,但在 Python2.x 版本不是一个函数,只是一个关键字。以下代码在 Py...

数据库逆向生成数据库表详细设计文档_weixin_30832405的博客-程序员秘密

数据库逆向生成数据库表详细设计文档转载于:https://www.cnblogs.com/da19951208/p/10442039.html

spring配置中<context:annotation-config> 和 <context:component-scan>区别_民谊玉超的博客-程序员秘密

Spring 开启Annotation <context:annotation-config> 和 <context:component-scan>诠释及区别

推荐文章

热门文章

相关标签