文章目录

  • 案例
  • getline()
  • get()

案例

题目描述:
读取用户输入的信息

测试代码:

#include <iostream>
using namespace std;int main() {char name[20];char food[20];cout << "请输入你的名字:" << endl;cin >> name;cout << "请输入你最喜欢吃的食物:" << endl;cin >> food;cout << "你的名字为:" << name<<endl;cout << "你最喜欢吃的食物为:" << food << endl;
}

运行结果:
请输入你的名字:
Hello World
请输入你最喜欢吃的食物:
你的名字为:Hello
你最喜欢吃的食物为:World

我们不难发现,在输入第二项内容时,直接跳过了,输出了最后的结果。这是为什么呢?这是因为,cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后, cin将该字符串放到数组中,并自动在结尾添加空字符。这也就解释了为什么运行结果是那样的,那怎么去修改呢,听我接着讲。

幸运的是,istream中的类(如 cin)提供了一些面向行的类成员函数: getline()和get( )。这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。下面详细介绍它们,首先介绍getline( )。

getline()

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

语法:

//将姓名读入到一个包含20个元素的name数组中。
cin.getline(name,20);

对一开始的例子进行修改:

#include <iostream>
using namespace std;int main() {char name[20];char food[20];cout << "请输入你的名字:" << endl;cin.getline(name, 20);cout << "请输入你最喜欢吃的食物:" << endl;cin.getline(food, 20);cout << "你的名字为:" << name<<endl;cout << "你最喜欢吃的食物为:" << food << endl;
}

运行结果:
请输入你的名字:
Hello World
请输入你最喜欢吃的食物:
banana apple
你的名字为:Hello World
你最喜欢吃的食物为:banana apple

get()

istream类有另一个名为 get()的成员函数,该函数有几种变体。其中一种变体的工作方式与getline()类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但get并不再读取并丢弃换行符,而是将其留在输入队列中。

  1. 如果采用与getline()一样的方式
#include <iostream>
using namespace std;int main() {char name[20];char food[20];cout << "请输入你的名字:" << endl;cin.get(name, 20);cout << "请输入你最喜欢吃的食物:" << endl;cin.get(food,20);cout << "你的名字为:" << name<<endl;cout << "你最喜欢吃的食物为:" << food << endl;
}

运行结果:
请输入你的名字:
Hello World
请输入你最喜欢吃的食物:
你的名字为:Hello World
你最喜欢吃的食物为:

我们会发现跟前面一样的问题,即还没输入就直接跳过了。为什么呢,由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因此get()认为已到达行尾,而没有发现任何可读取的内容。get()将不能跨过该换行符。

那怎么办呢,我们可以用不带参数的cin.get()来处理掉该换行符,请看下面代码:

#include <iostream>
using namespace std;int main() {char name[20];char food[20];cout << "请输入你的名字:" << endl;cin.get(name, 20);cin.get();//吸收换行符cout << "请输入你最喜欢吃的食物:" << endl;cin.get(food,20);cout << "你的名字为:" << name<<endl;cout << "你最喜欢吃的食物为:" << food << endl;
}

运行结果:
请输入你的名字:
Hello World
请输入你最喜欢吃的食物:
apple pear
你的名字为:Hello World
你最喜欢吃的食物为:apple pear

当getline()或get()读取空行时,将发生什么情况?最初的做法是,下一条输入语句将在前一条getline()或get()结束读取的位置开始读取;但当前的做法是,当get()(不是 getline())读取空行后将设置失效位( failbit)。这意味着接下来的输入将被阻断,但可以用下面的命令来恢复输入:

cin.clear();

C++字符串输入(详解)相关推荐

  1. (49)System Verilog字符串string详解

    (49)System Verilog字符串string详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog字符串string详解 5) ...

  2. Java正则表达式及字符串处理详解

    java正则表达式及字符串处理详解 本篇博文主要是对java String类涉及正则表达式方法及java.util.regex包中相关类和方法的一个总结 String类 相关方法 boolean ma ...

  3. CTF pwn题之格式化字符串漏洞详解

    格式化字符串漏洞详解 概念 如何利用 基本利用方式讲解 常用payload总结 pwntools -- FmtStr类 求偏移 地址泄露 任意地址写 一个例子 总结 概念   格式化字符串漏洞的成因在 ...

  4. iOS富文本字符串AttributedString详解

    原文链接: iOS富文本字符串AttributedString详解 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://gi ...

  5. mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)

    Mysql的数据类型主要分为三类:数字类型.字符串(字符)类型.日期和时间类型,由于时间紧迫,根据学习的需要 数字类型暂不做详解,等待有时间了在修改此文档,此文主要介绍mysql 数据类型中的字符串类 ...

  6. KMP字符串模式匹配详解

    KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一 ...

  7. Python 字符串方法详解

    Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息. 在编程中,几 ...

  8. BAT批处理中的字符串处理详解(字符串截取)

    BAT批处理中的字符串处理详解(字符串截取 批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集.批处理中可实现的字符串处理功能有:截取字符串内容.替换字符串特定字段.合并字 ...

  9. Hadoop之InputFormat数据输入详解

    Hadoop之InputFormat数据输入详解 Job提交流程和切片源码详解 FileInputFormat切片机制 CombineTextInputFormat切片机制 InputFormat接口 ...

  10. python字符串连接操作-Python连接字符串过程详解

    这篇文章主要介绍了python连接字符串过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在python中,如果有多个字符串,想要连接在一起, ...

最新文章

  1. 使用python-nmap模块扫描端口脚本
  2. 模拟浏览器发送请求报文
  3. 剥开比原看代码17:比原是如何显示交易的详细信息的?
  4. Flink再度霸榜,还不上车?
  5. docker查看容器创建命令
  6. 国内主流IT公司Field Sales销售薪资 来自著名猎头公司内部信息 给IT的朋友们知道个行情 - 天涯...
  7. Cisco路由器基础安全配置---特权模式和VTY线路密码
  8. AUTOSAR从入门到精通100讲(131)-AURIX中DMA模块对TIM的FIFO数据搬运
  9. Linux--安装yum源
  10. silk 编解码_Silk编解码在android实现
  11. 陈顺志 php,芦芽山之情
  12. linux查看删除init内容,linux常用命令
  13. 转化率高的爆款文案都是如何写出来的?
  14. 学hadoop需要什么基础
  15. 全局索引 前缀索引_面试系列 索引种类与优化
  16. flume介绍及应用
  17. Excel 入门到精通笔记
  18. 【数据库】国土空间规划数据库(全域)_模板空库
  19. 如何再UOS/Ubuntu中创使用ufw设置防火墙
  20. Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载

热门文章

  1. UEA20181224 郭恩赐 作业2019 3 22
  2. 赊了三串冰糖葫芦才写出来的小结
  3. “免费”,“标准”,“开放”软件异端
  4. 网站安全公司 实习道路上的经验分享
  5. 将MS-DOS6.22装入U盘和硬盘
  6. AtCoder Beginner Contest 204 A~E 题解
  7. Vue学习 — Vue响应式原理
  8. 推荐几个优质技术公众号
  9. 基于ROS的机器人系统(Python实现)--1 ROS系统与安装
  10. sat2 计算机科目,SAT2考试科目的技巧都有哪些?