C++学习之旅get、getline的用法

C++学习之旅get、getline的用法

面向行的输入:cin.getline()。

该函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline().该函数有两个参数。第一个参数是用来存储输入行的数组名称,第二个参数是要读取的字符数。如果这个参数为20,则该函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符’\0’.getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。

面向行的输入:cin.get()。istream类有另一个名为get()的成员函数,该函数有几种变体,其中一种变体的工 作方式与getline()类似,它们接收的参数相同,解释的参数也相同,并且每次都读取到行尾。但是get并不再读取并丢弃换行符,而是将其留在输入队列中。假设我们连续两次调用get();

cin.get(name, ArSize);
cin.get(dessert, ArSize);

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到第一个字符便是换行符。因此get()认为已经到达行尾,而没有发现任何可读取的内容。如果不借助与帮助,get将不能跳过换行符。幸运的是get()有另外一种变体,cin.get()它可以吃掉换行符。

比如:

cin.get(name, ArSize);
cin.get();
cin.get(dessert, ArSize);

另一种用法是将两个成员函数拼接起来(合并)

cin.get(name, ArSize).get()

之所以这样做的原因是由于cin.get(name, ArSirze)返回一个cin对象,该对象随后被用来调用get()

需要注意的是:有些C++的老版本没有实现不接受任何参数的get()变体,但是实现了接受一个char参数的get()变体,要使用该变体需要首先声明一个char变量。

char ch;
cin.get(name, ArSize).get(ch);


空行以及其他问题:

当getline()或get()读取空行时,将会发生什么情况呢?

最初的做法:下一条语句将在前一条getline()或get()结束读取的位置开始读取。

但是当前的做法是,当get()读取到空行后将设置失效位(falibit)。这意味着接下来的输入将被阻断。

但可以用下面的命令来恢复输入:

  cin.clear();

另一个潜在的问题是,输入字符串可能比分配的空间长。如果输入行包含的字符比指定的字符多,则getline()和get()将把余下的字符留给输入队列,而getline()还会设置失效位,并关闭其后面的输入。

需要指出的一点是:C++允许函数有多个版本,条件是这些版本的参数列表不同。如果使用的是cin.get(name, ArSize),则编译器知道要将一个字符串放入到数组中,因而将使用适当的成员函数。如果使用的是cin.get(),则编译器知道要读取一个字符———这是一种函数重载

为什么要使用get(),而不是getline()呢?因为老式实现是没有getline()的,其次get()使的输入更加的仔细、例如,假设用get()将一行读入数组中。如何知道停止读取的原因是由于读取了整行(换行符)还是由于数组已经填满了呢?查看下一个输入字符,如果是换行符则说明已经读取了整行,否则说明该行中还有其他输入。总之,getline()使用起来简单一些,但是get()使得检查错误更简单一些。可以用其中的任何一个来读取一行输入。但是我们要知道他们的行为是有些不同的。

时间: 2024-10-12 18:21:47

C++学习之旅get、getline的用法的相关文章

Hasen的linux设备驱动开发学习之旅--时钟

/** * Author:hasen * 参考 :<linux设备驱动开发详解> * 简介:android小菜鸟的linux * 设备驱动开发学习之旅 * 主题:时钟 * Date:2014-11-15 */ 一.内核定时器 1.内核定时器编程 软件意义上的定时器最终依赖硬件定时器来是实现,内核在时钟中断发生后执行检测各定时器是否到期, 到期后的定时器处理函数将作为软中断在底半部执行.实质上,时钟中断处理程序会唤起TIMER_SOFTIRQ 软中断,运行当前处理器上到期的所有定时器. Linu

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

SSIS 学习之旅 序章 和 简介

SSIS 学习之旅目录: 第一章: SSIS 学习之旅 第一个SSIS 示例(一) 第二章: SSIS 学习之旅 第一个SSIS 示例(二) 第三章: SSIS 学习之旅 数据同步 第四章: SSIS 学习之旅 FTP文件传输-FTP任务 第五章: SSIS 学习之旅 FTP文件传输-脚本任务 第六章: SSIS 学习之旅 FTP访问类 SSIS是Microsoft SQL Server Integration Services的简称,是生成高性能数据集成解决方案,是Microsoft BI 解

【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码) 基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String 字符串传输 a)         上层定义一个native的方法

python学习之 字符串前&#39;r&#39;的用法

python学习之 字符串前'r'的用法 在打开文件的时候open(r'c:\....') 加r和不加''r是有区别的 'r'是防止字符转义的 如果路径中出现'\t'的话 不加r的话\t就会被转义 而加了'r'之后'\t'就能保留原有的样子 在字符串赋值的时候 前面加'r'可以防止字符串在时候的时候不被转义 原理是在转义字符前加'\' 例: s=r'\tt' print(s) Output: '\tt' s='\tt' print(s) Output: '        t' python学习之

Git命令学习之旅——日志和穿梭版本号

在总结了git命令的基础之后,接下来我们看一下基础的一些进阶内容:删除撤销命令.日志查看命令等 既然有加入文件的功能,那么相相应的肯定有移除文件的功能,命令例如以下:git rm [文件名称] 在输入命令之后,例如以下图所看到的: 提示已经删除了"c.txt"文件.这个时候再用git status查看一下状态,例如以下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JB

Android热修复学习之旅——HotFix完全解析

在上一篇博客Android热修复学习之旅开篇--热修复概述中,简单介绍了各个热修复框架的原理,本篇博客我将详细分析QQ空间热修复方案. Android dex分包原理介绍 QQ空间热修复方案基于Android dex分包基础之上,简单概述android dex分包的原理就是:就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当classes.dex和classes1

菜鸟的Android学习之旅(一)

最近在拜读郭霖老师的经典<第一行代码>,作为一名菜鸟级的新手来说这本书确实对新手很友好,讲的很详细.如果你也像我一样作为一只小菜鸟想学习Android,还不了解这本书的,还没有想好入手哪一本书作为自己新手启蒙书的同学,个人觉得你就不要徘徊了,加入购物车吧! 因为我才是刚开始学习不久,第二章才学习了很少一部分,所以我没办法说点有营养的东西,我就先记录一下我学习过程中经历的错误吧. 第二章开始,郭老师教我们如何手动创建活动.边看书边敲代码,但是你会发现当你完全按照书上所说敲完所有需要的代码之后代码

iOS学习之旅10 ATS(App Transport Security)对HTTPS协议要求引起的问题

问题描述 编写以下代码获取网络某个资源的MIMEType 1 -(void)getMIMEType 2 { 3 //路径 4 NSURL *url = [NSURL URLWithString:@"https://www.baidu.com/img/bd_logo1.png"]; 5 //请求对象 6 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 7 NSOperationQueue *