字符串中的注意事项

在比较早的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.mzph.cn/web/40997.shtml

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

相关文章

MySQL基础篇(二)字符集以及校验规则

在MySQL基础篇(一)中,我们知道了如何创建数据库,这篇文章带大家了解创建的一些细节。 红色框:可省略,作用如果存在相同的数据库名称,就不会再创建,反之,创建。 蓝色框&…

uniapp 封装请求

新建request文件夹 下新建index.js 和index.js 或者创建units文件放入index.js 和api文件夹放入index.js(api.js)//看公司规范 1. index.js // 全局请求封装 // const base_url http://localhost:8080/devapi var base_url process.env.NODE_ENV development ? http://…

可用于多个微信管理的神器

以下仅是多微信聚合聊天管理界面: 可以在一个页面上同时收发多个微信的消息,可以添加好友,通过好友请求。 可以修改昵称,不受字数限制。 可以将常用图片,文件等放入素材库,方便聊天时查找和发送。 可以设置…

速盾:cdn 缓存图片

现如今,互联网已经成为我们日常生活中不可或缺的一部分。在我们使用互联网时,经常会遇到图片加载缓慢、文章打开慢等问题。为了解决这些问题,CDN(内容分发网络)应运而生。CDN 是一种通过将数据缓存在世界各地的服务器上…

集群环境下,调用半数以上节点进行数据同步的实现

核心实现是使用CountDownLatch来实现的,先取集群节点总数一半以上数量的CountDownLatch 再发送请求调用其他节点,在这个过程中对于正常响应的节点进行latch.countDown(); 最后再统计数量是否为0再决定是否抛异常 // 请求参数final String content jso…

Java:封装

文章目录 一、概念二、实现三、测试四、总结 一、概念 在面向对象编程中, 封装从字面上来理解就是包装的意思,特点就是信息隐藏,防止该类的代码和数据被外部类的代码随机访问。 封装的优点: 良好的封装能够减少耦合。 统一接口…

搜索旋转数组

题目链接 搜索旋转数组 题目描述 注意点 数组已被旋转过很多次数组元素原先是按升序排列的若有多个相同元素,返回索引值最小的一个 解答思路 首先需要知道的是,本题数组中的旋转多次只是将头部的某些元素移动到尾部,所以不论怎么旋转&am…

uni-app怎样使用组件

在uni-app中使用组件,主要遵循以下几个步骤: 创建组件文件:在UniApp项目中创建一个新的组件,通常将组件文件保存在components文件夹下。如果components文件夹不存在,需要先创建它。然后在components文件夹下创建一个新…

Pycharm python解释器 unsupported python 3.1 解决

Pycharm 环境 unsupported python 3.1解决 1. 问题重现2. 原因分析3. 解决方法 1. 问题重现 之前使用Pycharm 2024.1.1的时候,环境配置的Python 3.11.9,现在改成使用Pycharm 2020.2.2,结果Python解释器显示“unsupported python 3.1”&#…

Java ORM框架FastMybatis踩坑

Java ORM框架FastmyBatis踩坑 问题:使用了FastmyBatis的saveOrUpdate方法,明明设置了主键的值且表中存在,但是依然执行insert操作。导致Duplicate PK。 原因:使用了其他第三方包的注解指定表的主键,没有按照FastmyBat…

低音炮内存卡格式化后无法播放音乐文件

试了多次 不支持ntfs不支持exfat 仅支持fat32 FAT32与exFAT的区别主要体现在来源、单个文件限制、适用情况以及兼容性方面。12 来源: FAT32是Windows平台的传统文件格式,首次在Windows 95第二版中引入,旨在取代FAT16,具有良好的…

自动驾驶中的逆透视变换(Inverse Perspective Mapping,IPM)详解

前言 IPM(Inverse Perspective Mapping,逆透视变换)图的历史可以追溯到计算机视觉和图像处理领域的发展。逆透视变换是一种用于消除图像中透视效应的技术,使得原本由于透视产生的形变得以纠正,进而更准确地描述和理解图像中的场景。比如在行车中的车道线检测,泊车中的常见…

陈志泊主编《数据库原理及应用教程第4版微课版》的实验题目参考答案实验2

实验目的 1.掌握在SQL Server中使用对象资源管理器和SQL命令创建数据库与修改数据库的方法。 2.掌握在SQL Server中使用对象资源管理器或者SQL命令创建数据表和修改数据表的方 法(以SQL命令为重点)。 实验设备 操作系统:Win11…

使用Source Insight 4.0

一、使用书签 二、添加文件 三、Search 3.1 替换所有变量 四、右键查询 4.1 查看被调用的地方

Linux上脚本备份数据库(升级版)

直接上代码: #!/bin/bash# 配置部分 mysql_user"root" mysql_host"localhost" mysql_port"3306" mysql_charset"utf8mb4" mysql_defaults_file"/home/mysql/mysql_back/.my.cnf"backup_base_dir"/mnt/sdd/…

GRPC使用之HelloWorld

使用grpc的好处是提供高效的序列化能力,能够跨语言进行调用。这一节我们来学习grpc的入门应用,整篇文章分成3部分: 接口定义,使用grpc的IDL,创建proto文件,编译/生成grpc文件服务端开发,处理客户端请求&am…

计算云服务1

前言 一直以来,计算资源都是整个企业业务系统发展所需的大动脉,没有计算资源,企业业务就无法正常运行。在云计算的时代里,计算服务也是云服务中的第一大类服务,计算资源的重要性由此可见。本章,我们将带领…

C++之do-while陈述

回圈是用来进行进行重复性的工作,典型的回圈会进行下列三项基本任务 1.控制变数初始设定2. 回圈结束条件测试3. 调整控制变数的值 关键字(keyword) do与while构成C 中回圈的一种,常用于后测式的回圈,意思是回圈会先进行第一轮,然后…

017-GeoGebra基础篇-微积分函数求解圆弧面积问题

基础篇慢慢的走进尾声,今天给大家带来一个小项目,是关于高中数学微积分部分的展示,这个项目主要包含了函数的介绍、函数与图形绘制的区别、区域函数图像的绘制、积分函数的应用、动态文本的调用、嵌套滑动条的应用等等,以及其他常…

基于Transformer神经网络的锂离子电池剩余使用寿命估计MATLAB实现【NASA电池数据集】

Transformer神经网络 基于Transformer神经网络的锂离子电池剩余使用寿命估计是一种先进的方法,它利用了Transformer模型在处理序列数据方面的优势。 Transformer能够有效地捕捉时间序列中的长程依赖关系和非线性模式,相比传统的基于循环神经网络&…