本来这一讲应该是while、for、if之类的,但是,我们可是学过C的男人,再浪费时间搞这个???

还不如学点C++中的新知识。

cin对象支持3种不同模式的单字符输入,其用户接口各不相同。

下面我们在while循环中进行这三种模式的讲解。

【第一种】:使用原始的cin进行输入

//使用循环来读取来自键盘的文本输入
//使用字符'#'作为停止标记
char ch;
cin>>ch;
while(ch != '#'){
...
cin>>ch;
}

注意:cin读取char值时,与读取其他基本类型一样,将忽略空格和换行符。因此输入中的空格没有被回显,也没有被包括在计数内。

有一点复杂的是,发送给cin的输入被缓冲。这意味着只有在用户按下回车键后,他输入的内容才会被发给程序。这就是在运行该程序时,可以在#后面输入字符的原因。按下回车键后,整个字符序列将被发送给程序,但程序在遇到#字符后将结束对输入的处理。

【第二种】:使用cin.get(char)进行补救

然而,我们若是需要检查包括空格、制表符和换行符之内的所有字符,那么就不能用原始的cin输入了。

cin所属的istream类(在iostream中定义)中包含一个能够满足这种要求的成员函数。具体地说,成员函数cin.get(ch)读取输入中的下一个字符(即使它是空格),并将其赋给变量ch。

char ch;
cin.get(ch);
while(ch != '#'){
...
cin.get(ch);
}

这个程序回显了每个字符,并将全部字符计算在内,其中包括空格。

面对这段程序,我们会疑惑:cin.get(ch)调用将一个值放在ch变量中,这意味着将修改该变量的值。然而我们在C语言的时候,要修改变量的值,必须将变量的地址传递给函数。但上段程序中调用cin.get()时,传递的是ch,而不是&ch。

的确,这样的代码在C语言中无效,但在C++中却有效,只要函数将参数声明为引用即可。头文件 iostream将cin.get(ch)的参数声明为引用类型,因此该函数可以修改其参数的值。

【第三种】不带参数的cin.get()

我们知道在C语言时,我们使用的字符I/O函数是getchar()和putchar(),在C++中,我们可以看看这种方式:

不接受任何参数的cin.get()成员函数返回输入中的下一个字符,即可以这样使用:

ch=cin.get();

该函数的工作方式与C语言中的getchar()相似,将字符编码作为int值返回;而cin.get(ch)返回一个对象,而不是读取的字符。同样,可以使用cout.put()函数来显示字符:

cout.put(ch);

该函数的工作方式类似C语言中的putchar(),只不过其参数类型为char,而不是int。

注意,put()成员只有一个原型——put(char) 。可以传一个int参数给它,该参数将被强制转换为char。

为成功地使用cin.get(),需要知道其如何处理EOF条件。当该函数到达EOF时,将没有可返回的字符。相反,cin.get()将返回一个用符号常量EOF表示的特殊值。该常量是在头文件iostream中定义的。EOF的值必须不同于任何有效的字符值,以便程序不会将EOF与常规字符混淆。通常,EOF被定义为值-1,因为ASCII码为-1的字符,但并不需要知道实际的值,而只需在程序中使用EOF即可。

char ch;
cin.get(ch);
while(cin.fail() == false){
...
cin.get(ch);
}

可以使用int ch,并用cin.get()代替cin.get(char),用cout.put()代替cout,用EOF测试代替cin.fail() 。

int ch;
ch = cin.get();
while(ch != EOF){
...
ch = cin.get();
}

在上述程序中,如果ch是一个字符,则循环将显示它。如果ch为EOF,则循环将结束。

提示:需要知道的是,EOF不表示输入中的字符,而是指出没有字符。

呀呀呀 ,不好意思,接下来的额解释我还没弄懂,在书本p158页。我先看看其他的额。

其中书本p155页的5.5.4我也没看。

来看一道复习题:

在查看输入方面,cin>>ch同cin.get(ch)和ch=cin.get()有什么不同?

答:

  • cin>>ch不能读取空格,换行符,tab字符等。他从遇见的第一个非这些字符开始读取(之前的这些字符将被舍弃),一直读取到遇见这些字符为止,且不读取,且不舍弃。他可以读取各种类型,如int、double、long、char、string等
  • cin.get(ch)的效果是将读取到的字符赋值给ch,它读取空格、换行符、tab字符等。但它对类型有限制,char类型是可以的(貌似且只能读取char类型)。
  • ch=cin.get()也是只读取一个字符,可以读取空格、换行符、tab等,但是它可以读取int类型,读取string类型等多个类型,但它只能读取char内存宽度的字符,假如字符宽度超过char类型,他无法全部读取。

第5讲——cin处理字符输入的更多相关文章

  1. Java IO详解(四)------字符输入输出流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  2. 【原创】自制string类型(已完成)

    这篇文章首发于360doc http://www.360doc.com/content/21/0526/17/73755266_979099504.shtml ,其实360doc里面的那个也是我的帐号 ...

  3. C++输入cout与输出cin

    输入和输出并不是C++语言中的正式组成成分.C和C++本身都没有为输入和输出提供专门的语句结构.输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的.C++的输出和输入是用" ...

  4. 背包九讲 && 题目

    ★.背包求方案数的时候,多重背包是不行的,因为产生重复的背包会有多种情况. ★.背包记录路径的时候,其实是不行的,因为更新了12的最优解,如果它依赖于6这个背包,然后你后面改变了6这个背包,就GG 1 ...

  5. C++IO关于cin>>和getline的理解

    这个问题困扰了我有一段时间了,趁着十一放假有时间,仔细研究了一下 首先来看一下输入输出运算符cin>>的构成:cin和>> cin>>是由两部分构成的,cin和&g ...

  6. 关于cin,getchar(),scanf()的注意事项(转)

      问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的.但是有时候却就是因为使用这些 ...

  7. 深入浅出scanf、getcha、gets、cin函数

    转:问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的.但是有时候却就是因为使用这些 ...

  8. Gengxin讲STL系列——String

    衔接上一篇引导. 作为第一篇博客,就要大气一点. 可我好像并不知道怎么才能让自己的博客大气一点= =: 明天是我生日,自己先买个中文域名庆祝了一下…… 好了,废话说完了,结果博客也没大气到哪去……,正 ...

  9. 深入理解 while(cin >> x >> y)

    初步分析 在C++中实现连续输入时,我们会用到 while(cin >> x >> y) ,但是它的条件判断的原理可不那么好想,这里我分享一下我对于它的见解. 首先来看 cin ...

随机推荐

  1. iOS | 地图定位

    在IOS开发中,最常见的功能之一就是地图定位功能,不单单是百度地图,高德地图等专业的地图导航软件,还有美团,咕咚等一些美食购物类和运动类也需要这样的功能,所以学会这项技能是一名IOS开发工程师必须的. ...

  2. Webpack学习笔记九 webpack优化总结

    webpack 优化笔记 webpack4 自带的优化包括 swingTree(摇摆树)和作用域提升 swingTree 比如入口文件 index.js引入通用方法 util, 里面有 10个方法, ...

  3. Java 基础标识符

    标识符: 程序员为自己定义的类,方法或者变量等起的名称. 标识符由大写字母,数字,下划线(_)和美元符号组成,但不能以数字开头.Java 语言中严格区分大小写. 包名: 使用小写字母. 类名和接口名: ...

  4. 2018 Wannafly summer camp Day3--Shopping

    Shopping 描述 题目描述: 你要买n件物品,其中有一些是凳子. 商场正在举行促销活动,如果购物车中有至少一个凳子,那么你可以半价购买这个购物车中最贵的一个物品. 你有m辆购物车,请最小化你的花 ...

  5. springboot的aop编程

    以下内容是模仿杨开振<<深入浅出springboot 2.x>>的4.2章节内容. 开始前,需要先修改pom.xml,加入以下内容 <!-- https://mvnrep ...

  6. java 读取图片并转化为二进制字符串

    本例子的目的在于测试往oracle数据库中插入blob字段 //以下代码源于:https://www.cnblogs.com/ywlx/p/4544179.html public static Str ...

  7. ArrayList调用remove(int index)抛出UnsupportedOperationException问题分析以及解决记录

    使用Arrays转数组成为List后,不能调用add(...)和remove(...)方法,此时如果调用就会抛出UnsupportedOperationException异常 原因 其实Arrays. ...

  8. 堆数据结构(heapq)简单应用

    ## 堆数据结构(heapq)简单应用 # 堆数据结构 heapq # 常用方法:nlargest(),nsmallest(),heapify(),heappop() # 如果需要的个数较小,使用nl ...

  9. 多线程编程以及socket编程_Linux程序设计4chapter15

    看了Linux程序设计4中文版,学习了多线程编程和socket编程.本文的程序参考自Linux程序设计4的第15章. 设计了一个客户端程序,一个服务端程序.使用TCP协议进行数据传输. 客户端进程创建 ...

  10. Spring BindingResult验证框架Validation特殊用法

    使用注解@Valid(实体属性校验) Springboot实现 Spring实现 一.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate ...