字符串中的注意事项

在比较早的C/C++版本中,经常可以看到推荐使用gets函数来进行整行字符串的输入,就像下面这样的简单写法即可输入一整行:

C++

gets(str);

但是当输入的字符串长度超过数组长度上限MAX_LEN时,gets函数会把超出的部分也一并读进来,并且会覆盖数组之外的内存空间,这就导致了一定的安全风险,因此C++11标准将gets函数废弃了,然后在C++14时将该函数移除,如果现在想要整行输入的话,推荐使用cin.getline函数(见下文)。

下面对三种整行输入方法进行解释。

cin.getline:仅C++可用,C语言不可用。需要添加#include 头文件,并且在头文件后增加一行using namespace std;。然后我们可以像下面这样使用,其中第一个参数是字符数组,第二个参数是最大允许读入的字符个数,设置为字符数组的长度即可。
C++

cin.getline(str, MAX_LEN);

scanf("%[^\n]", str):C++和C语言均可用。原理是使用scanf的正则表达式输入功能,其中%[^\n]的含义是 “只要不为\n,就一直读入”,也就是说它会读入到换行符结束(或者全部读完),即实现了读入整行的效果。关于正则表达式的内容留给有兴趣的同学了解,这里就不展开了。需要注意,这种方式不会把碰到的换行符处理掉,导致连续输入多行字符串的时候还要自己动手处理换行符,并不是很方便(可以参考 字符串输入输出II),因此一般不推荐使用这种写法。

fgets:C++和C语言均可用。用法如下所示,其中第一个参数是字符数组,第二个参数是最大允许读入的字符个数,设置为字符数组的长度即可,第三个参数是文件指针,对做算法题来说设置为stdin即可,表示标准输入流。

C++

fgets(str, MAX_LEN, stdin);

但是fgets函数有个特点,就是它会把我们输入的换行符也读到字符数组里,这就给我们做算法题带来一些麻烦(特别是要读入多行字符串的情况,因为基本上的题都是不需要在字符数组的末尾加这个换行的),因此在使用fgets函数输入后需要做额外处理,即把\n替换为\0,如下所示:

C++

fgets(str, MAX_LEN, stdin);
str[strcspn(str, "\n")] = '\0';

其中strcspn函数需要引入string.h头文件,含义是在一个数组中寻找某个或某些字符(例如"abc"表示寻找字符’a’或字符’b’或字符’c’,"\n"表示寻找换行符),并返回第一个满足的下标。注意不能用str[strlen(str) - 1] = '\0’的方式来实现,因为如果是读入最后一行的话可能不是以\n结尾,这时候字符数组末尾不会有多余的\n。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用redis数据库管理代理库爬取cosplay网站-cnblog

爬取cos猎人 数据库管理主要分为4个模块,代理获取模块,代理储存模块,代理测试模块,爬取模块 cos猎人已经倒闭,所以放出爬虫源码 api.py 为爬虫评分提供接口支持 import requests import concurrent.futures import …

鸿蒙开发设备管理:【@ohos.vibrator (振动)】

振动 说明: 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 imp…

查询某个县区数据,没有的数据用0补充。

加油,新时代打工人! 思路: 先查出有数据的县区,用县区编码判断,不存在县区里的数据。然后,用union all进行两个SQL拼接起来。 SELECTt.regionCode,t.regionName,t.testNum,t.sampleNum,t.squareNum,t.crop…

linux主机(A)通过私钥登录linux主机(B)

1.登录B主机,先在B主机执行 ssh-keygen 2.设置id_rsa的权限 chmod 600 id_rsa 3.将生成的id_rsa.pub导入到authorized_keys ssh-copy-id -i ./id_rsa.pub root127.0.0.1 4.将id_rsa复制到A主机 scp id_rsa_123 root1.1.1.A:/home/ 5.登录到A主机使用私钥登录 因…

dotnet ef工具使用

设置工具安装目录 dotnet tool install dotnetsay --tool-path G:\dotnet-tools安装 dotnet tool install --global dotnet-ef更新 dotnet tool update --global dotnet-ef查看版本 dotnet ef --version创建迁移文件 # 只有一个dbcontext dotnet ef migrations add init #…

微机原理与单片机 知识体系梳理

单片机笔记分享 我个人感觉单片机要记的东西很多,也很琐碎,特别是一些位、寄存器以及相关作用等,非常难以记忆。因此复习时将知识点整理在了一起做成思维导图,希望对大家有所帮助。内容不是很多,可能有些没覆盖全&…

PySide6 实现资源的加载:深入解析与实战案例

目录 1. 引言 2. 加载内置资源 3. 使用自定义资源文件(.qrc) 创建.qrc文件 编译.qrc文件 加载资源 4. 动态加载UI文件 使用Qt Designer设计UI 加载UI文件 5. 注意事项与最佳实践 6. 结论 在开发基于PySide6的桌面应用程序时&…

Qt 基础组件速学 事件过滤器

学习目标:理解事件过滤器 前置环境 运行环境:qt creator 4.12 学习内容和效果演示: Qt 提供了事件过滤器的机制,允许我们在事件到达目标对象之前对事件进行拦截和处理。这在以下情况下非常有用: 全局事件处理: 我们可以在应用程序级别安装一个事件过…

JVM(13):虚拟机性能分析和故障解决工具之Visual VM

1 Visual VM作用 是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且可以遇见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样,预示着他除了运行监视、故障处理外&…

Android在framework层添加自定义服务的流程

环境说明 ubuntu16.04android4.1java version “1.6.0_45”GNU Make 3.81gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 可能有人会问,现在都2024了怎么还在用android4版本,早都过时了。确实,现在最新的都是Android13、And…

基于YOLOv5的人脸目标检测

本文是在之前的基于yolov5的人脸关键点检测项目上扩展来的。因为人脸目标检测的效果将直接影响到人脸关键点检测的效果,因此本文主要讲解利用yolov5训练人脸目标检测(关键点检测可以看我人脸关键点检测文章) 基于yolov5的人脸关键点检测:人脸关键点检测…

复现YOLO_ORB_SLAM3_with_pointcloud_map项目记录

文章目录 1.环境问题2.遇到的问题2.1编译问题1 monotonic_clock2.2 associate.py2.3 associate.py问题 3.运行问题 1.环境问题 首先环境大家就按照github上的指定环境安装即可 环境怎么安装网上大把的资源,自己去找。 2.遇到的问题 2.1编译问题1 monotonic_cloc…

Android增量更新----java版

一、背景 开发过程中,随着apk包越来越大,全量更新会使得耗时,同时浪费流量,为了节省时间,使用增量更新解决。网上很多文章都不是很清楚,没有手把手教学,使得很多初学者,摸不着头脑&a…

jmeter测试工具学习

1.双击jar包打开,发现那个bat打不开 2.新建plan之后编辑添加线程组 会加入500*5次请求 3.添加HTTP请求 添加字段 为了让http请求发送到不同的分片,要把userid随机化 4.添加监听器 5.聚合报告

Wish卖家必读:如何安全有效地进行店铺测评

Wish以其独特的商业模式和先进的技术在电商领域独树一帜。作为北美和欧洲最大的移动电商平台之一,Wish拥有庞大的用户基础,其中90%的卖家来自中国,这不仅显示了其在全球电商市场中的影响力,也反映了其对中国卖家的吸引力。 Wish平…

vxe-table合并行数据;element-plus的el-table动态合并行

文章目录 一、vxe-table合并行数据1.代码 二、使用element-plus的el-table动态合并行2.代码 注意&#xff1a;const fields 是要合并的字段 一、vxe-table合并行数据 1.代码 <vxe-tableborderresizableheight"500":scroll-y"{enabled: false}":span-m…

Ubuntu 22.04远程自动登录桌面环境

如果需要远程自动登录桌面环境&#xff0c;首先需要将Ubuntu的自动登录打开&#xff0c;在【settings】-【user】下面 然后要设置【Sharing】进行桌面共享&#xff0c;Ubuntu有自带的桌面共享功能&#xff0c;不需要另外去安装xrdp或者vnc之类的工具了 点开【Remote Desktop】…

window系统openssl开发环境搭建(VS2017)

window系统openssl开发环境搭建 VS2017 一、下载openssl二、安装openssl三、openssl项目配置3.1 配置include文件3.2 配置openssl动态库四、编写openssl测试代码五、问题总结5.1 问题 一5.2 问题二一、下载openssl https://slproweb.com/products/Win32OpenSSL.html 根据自己…

CTF实战:从入门到提升

CTF实战&#xff1a;从入门到提升 &#x1f680;前言 没有网络安全就没有国家安全&#xff0c;网络安全不仅关系到国家整体信息安全&#xff0c;也关系到民生安全。近年来&#xff0c;随着全国各行各业信息化的发展&#xff0c;网络与信息安全得到了进一步重视&#xff0c;越…

【总线】AXI4第八课时:介绍AXI的 “原子访问“ :独占访问(Exclusive Access)和锁定访问(Locked Access)

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…