C++字符串输入问题详解

C++中字符串分为C风格字符串(就是char数组)和string字符串类型(需要包含string头文件),针对这两种类型,C++提供了很多方法可供输入:cin, cin.get(), cin.getline(), getline()

cin

这是最常用的方法,cin可以接收一个字符串,无论是string对象还是char []数组都可用cin输入。用cin输入时,会跳过开头的空白字符(“空格”, “TAB”, “回车”),并且结尾遇到空白字符就会认为输入结束。

下面的代码分别创建了字符数组a和string对象b,接收输入并打印出来。

#include <iostream>
#include <string>using namespace std;int main()
{char a[10];string b;cout << "Enter char[]: ";cin >> a;cout << "Enter string: ";cin >> b;cout << endl<< "char[]:" << a << " string: " << b << endl;return 0;
}

不输入空白字符的情况下,一切正常,分两次输入的abc和def,都正常打印出来:
QQ_1720575276634.png

输入空白字符的情况下,此时只进行了一次输入”abc<空格>def“。cin遇到空格认为输入结束,于是将abc保存在字符数组a中,剩下的”<空格>def“仍然保存在缓冲区中。在第二个cin执行时,由于缓冲区中仍有字符,所以没有让用户进行输入。第二个cin跳过了开头的空白字符,遇到认为输入结束,所以读取了”def“并保存在string对象b中:
QQ_1720575911285.png

cin.get()

cin.get()主要用于读取单个字符或字符数组,可以接收空白字符。它有很多重载的版本,无论哪个版本都不能输入string对象。

无参数

无参数的cin.get()用来从指定的输入流中提取一个字符(包括空白字符),函数的返回值就是读入的字符,返回类型为int类型。 若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File),一般以-1代表EOF,用-1而不用0或正值,是考虑到不与字符的ASCII代码混淆,但不同的C ++系统所用的EOF值有可能不同。

#include <iostream>using namespace std;int main()
{char c;while ((c = cin.get()) != EOF)cout << c;cout << "ctrl+z ,Done" << endl;return 0;
}

执行效果如下:
QQ_1720576832527.png
注意:cin.get()不会消耗缓冲区中的回车。其另一种常见用法为通过cin.get()(不赋给任何变量)来消耗缓冲区中的回车。

一参数

其调用形式为cin.get(ch),其作用是从输入流中读取一个字符,赋给字符变量ch。如果读取成功则函数返回true(真),如失败(遇文件结束符) 则函数返回false(假)。

#include <iostream>using namespace std;int main()
{char c;while (cin.get(c))cout << c;cout << "ctrl+z ,Done" << endl;return 0;
}

执行效果如下:
QQ_1720577136474.png

二参数

其调用形式为cin.get(字符数组名, 接收字符数n)。主要用来接收一行字符串(可以接收空格),这个最大的用途是可以定量的接收字符的个数。但是要注意,如果定义的数组的个数是n,则实际上只能接收n-1个字符,还要加上’\0’。

#include <iostream>using namespace std;int main()
{char a[5], b[5];cin.get(a, 5);cin.get(); // 用于消耗缓冲区中的回车cout << a << endl;cin.get(b, 5);cout << b << endl;cout << "done" << endl;return 0;
}

执行效果如下:
QQ_1720578115406.png

前面说过,cin.get()不会消耗缓冲区中的回车,所以在上述代码中,用了一次无参数版本的cin.get()来消耗回车,从而保证输入的正确。
如果没有第9行的代码,第二次的输入遇到缓冲区中的回车就结束了,从而认为用户输入了空字符串,执行效果如下。
QQ_1720578249636.png

三参数

其调用形式为cin.get(字符数组名, 接收字符数n, 终止字符)。其作用是从输入流中读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回true(真),如失败(遇文件结束符) 则函数返回false(假)。

#include <iostream>using namespace std;int main()
{char a[5];cin.get(a, 5, '#');cout << a << endl;return 0;
}

执行效果如下:
QQ_1720578716385.png

第一次输入了很多字符,只读取了4个;第二次由于遇到了’#',提前结束输入。

cin.getline()

cin.getline()cin.get()的作用差不多,都能接收空白字符的输入,都不能输入string对象。其用法也大致相同,但是cin.getline()只有二参数和三参数版本,没有无参数和一参数版本。

cin.getline()cin.get()的一个重要区别是:cin.getline()会消耗缓冲区中的回车,而cin.get()不会。

二参数

其调用形式为cin.getline(字符数组名, 接收字符数n)

#include <iostream>using namespace std;int main()
{char a[5], b[5];cin.getline(a, 5);cout << a << endl;cin.getline(b, 5);cout << b << endl;cout << "done" << endl;return 0;
}

这段代码和cin.get()二参数版本中的代码类似,除了将cin.get()换成cin.getline(),还去掉了用于消耗回车的cin.get()。执行效果如下:
QQ_1720579933420.png
由于cin.getline()会消耗回车,所以不需要cin.get()

三参数

其调用形式为cin.getline(字符数组名, 接收字符数n, 终止字符)。代码类似cin.get()三参数版本,就不放了。

getline()

getline()可以接受一个字符串输入,包括空格,但需要引入头文件string。因为cin.getline()属于istream流,而getline()属于string流。getline()函数不能输入char数组,只能输入string对象。

getline()返回输入流对象的引用。通过检查这个返回值,可以判断读取操作是否成功。

二参数版本

定义:std::getline(std::istream& is, std::string& str);

  • is:输入流对象,通常是std::cin
  • str:存储读取内容的字符串对象。
#include <iostream>
#include <string>using namespace std;int main()
{string str;while (getline(cin, str))cout << "You entered: " << str << endl;cout << "done" << endl;return 0;
}

执行效果如下:
QQ_1720581161467.png

三参数版本

定义:std::getline(std::istream& is, std::string& str, char delim);

  • is:输入流对象,通常是std::cin
  • str:存储读取内容的字符串对象。
  • delim(可选):指定的分隔符,默认是换行符 \n。
#include <iostream>
#include <string>using namespace std;int main()
{string str;getline(cin, str, '#');cout << str << endl;return 0;
}

执行效果如下:
QQ_1720581407256.png

总结

下表总结了上述方法的区别

输入char数组输入string字符串输入空白字符其他
cin×
cin.get()×不消耗回车
cin.getline()×消耗回车
getline()×

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3226038.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【数学建模学习手册】第三章:规划模型(一)

本专栏内容为&#xff1a;数学建模原理 记录学习数学建模 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;数学建模 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学…

FastAPI 学习之路(三十四)数据库多表操作

之前我们分享的是基于单个表的数据库表的操作&#xff0c;我们在设计数据库的时候也设计了跨表&#xff0c;我们可以看下数据库的设计 class User(Base):__tablename__ "users"id Column(Integer, primary_keyTrue, indexTrue)email Column(String(10), uniqueTr…

工厂水电燃气表流量计等能耗计量仪表非侵入式拍照抄表的方案

在企业园区、工厂等企事业单位&#xff0c;传统的手动抄表方式已逐渐不能满足现代化、信息化管理的需求。为了提高抄表工作的效率&#xff0c;减少人工操作的误差&#xff0c;同时保障数据的安全性和实时性&#xff0c;我们提出了拍照采集抄表方案。本方案旨在通过拍照的方式&a…

三品PLM管理系统软件:制造企业工程变更管理的革新者

在当今快速变化的市场环境中&#xff0c;制造企业面临着前所未有的挑战。客户需求的不断变化、供应链的波动、设计过程中的不确定性以及产品生命周期的缩短&#xff0c;都要求企业能够迅速响应并适应这些变化。工程变更管理作为企业响应市场变化、提升产品竞争力的关键环节&…

大气热力学(6)——位温和假相当位温

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记&#xff0c;现转化为电子版本以作存档。相较于手写笔记&#xff0c;电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 文章目录 6.1 位温6.2 斜 T-lnP 图&#xff08;Skew T-lnP&#xff09;6.2…

编程范式之声明式编程

目录 前言1. 声明式编程的定义2. 声明式编程的特点2.1 可读性高2.2 抽象层次高2.3 并行性和优化 3. 声明式编程的应用场景3.1 数据查询与处理3.2 用户界面描述3.3 配置管理 4. 声明式编程的优点4.1 可维护性强4.2 开发效率高4.3 系统优化潜力大 5. 声明式编程的缺点5.1 学习曲线…

包装器 std::function

使用前&#xff0c;包头文件&#xff1a;#include <functional> std::function 是 C标准库 中的一个通用函数包装器&#xff1b; 它可以储存、复制、调用任何可调用的对象&#xff0c;包括&#xff1a;函数指针、成员函数、绑定的成员函数、lambda表达式、仿函数等。 1…

web 网络安全

Web网络安全是网络安全的一个重要分支&#xff0c;专注于保护Web应用程序、服务和网站免受各种网络威胁。学习Web网络安全涉及多个层面的知识和技能&#xff0c;以下是一些主要的学习领域&#xff1a; 一、XSS攻击 全称:&#xff1a;Cross Site Script &#xff08;跨站脚本&a…

从Helm到 Operator:Kubernetes应用管理的进化

&#x1f9f0;Helm 的作用 在开始前需要先对 kubernetes Operator 有个简单的认识。 以为我们在编写部署一些简单 Deployment 的时候只需要自己编写一个 yaml 文件然后 kubectl apply 即可。 apiVersion: apps/v1 kind: Deployment metadata: labels: app: k8s-combat …

qq动态删了怎么恢复?五分钟找回您的QQ动态

在使用QQ空间时&#xff0c;我们经常会发现自己误删了一些重要的动态。这可能是由于手指滑动不慎或者误操作引起的。无论是珍贵的回忆还是重要的信息&#xff0c;一旦被删除&#xff0c;我们都希望能够找回来。那么&#xff0c;qq动态删了怎么恢复&#xff1f; 在本文中&#…

学科竞赛管理

0034springboot学科竞赛管理 毕业论文(设计)题 目: 学科竞赛管理系统的设计与实现院(系):专业年级:姓 名:学 号:指导教师:2021年04月14日摘 要随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大 的数目的竞赛信息&#…

华为机试HJ105记负均正II

华为机试HJ105记负均正II 题目&#xff1a; 想法&#xff1a; 分别记录输入中的正数和负数&#xff0c;根据规则计算平均值即可 count 0 sum 0 sum_count 0 while True:try:number float(input())if number < 0:count 1elif number > 0:sum numbersum_count 1e…

Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce

章节内容 上节我们完成了&#xff1a; Sqoop 介绍Sqoop 下载配置环境等Sqoop 环境依赖&#xff1a;Hadoop、Hive、JDBC 等环境补全 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机…

深度解析C++重载、隐藏、重写

重载 函数重载是指两个函数在同一个作用域并且函数名相同、参数(参数个数或类型或类型顺序 )不同的一种特殊情况 // 1、参数类型不同 int Add(int left, int right){cout << "int Add(int left, int right)" << endl;return left right; } double Add…

数据结构(初阶1.复杂度)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

华为HCIP Datacom H12-821 卷34

1.单选题 防火墙默认已经创建了一些安全区域,以下哪一个安全区域不是防火墙上默认存在的? A、Trust B、DMZ C、Internet D、Local 正确答案&#xff1a; C 解析&#xff1a; 防火墙默认情况下为我们提供了三个安全区域&#xff0c;分别是 Trust、DMZ和Untrust 2.判断题 …

案例|水上水下一体化测量,为九寨沟精准把脉

​ 九寨沟&#xff0c;被誉为“人间仙境”&#xff0c;其湖群以独特的地理位置和优美的自然景观吸引着世界各地的游客&#xff0c;更是九寨沟生态系统中不可或缺的重要组成部分。因此&#xff0c;精准地掌握湖群的地形数据、水体分布及变化情况&#xff0c;能够揭示水下生态系…

Operator 部署Prometheus

安装说明 kube-prometheus https://prometheus-operator.dev/docs/https://github.com/prometheus-operator/kube-prometheus 该存储库收集 Kubernetes 清单、Grafana仪表板和Prometheus 规则以及文档和脚本&#xff0c;以使用 Prometheus Operator 通过Prometheus提供易于操…

提升困难生学工支持:智慧校园的新功能介绍

智慧校园的学工管理系统内嵌的困难生信息管理功能&#xff0c;是一个综合性的服务平台&#xff0c;专注于精准识别校园内的经济困难学生&#xff0c;并给予他们必要的帮助与关怀&#xff0c;确保每位学生都能在公平的环境中追求学业和个人成长。这一功能通过一系列信息化手段&a…

1Panel 安装常见问题与解决方案指南

安装 参考 1Panel 文档 - 在线安装 部分&#xff0c;这里仅作常见安装失败的问题解析。 常见Q&A 收集自 1Panel微信群&#xff0c;论坛以及GitHub issue Q1. 安装过程中提示 docker 安装失败 [1Panel Log]: … 启动 docker Failed to enable unit: Unit file docker.ser…