当前位置: 首页 > news >正文

字符串中的注意事项

在比较早的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。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Postman深度解析:打造高效接口测试自动化流程
  • firewalld(6)自定义services、ipset
  • Spring 使用 Ehcache 技术指南
  • OFDM中采样频率与带宽的关系
  • 什么是设计模式以及常见的例子(如单例、工厂、观察者等)
  • IT高手修炼手册(3)程序员命令
  • 如何在Java中实现实时数据同步与更新
  • 基于springboot+vue+uniapp的高校宿舍信息管理系统小程序
  • Kotlin算法:把一个整数向上取值为最接近的2的幂指数值
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十一)-git(3)
  • 毕业季有感
  • Python 获取tiktok视频评论回复数据 api接口
  • 第二十七天 第八章 贪心算法 part01 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
  • ARMv8寄存器详解
  • 一个简单的spring+kafka生产者
  • JS 中的深拷贝与浅拷贝
  • (三)从jvm层面了解线程的启动和停止
  • 【css3】浏览器内核及其兼容性
  • Angular 响应式表单之下拉框
  • Java多线程(4):使用线程池执行定时任务
  • java中具有继承关系的类及其对象初始化顺序
  • JDK 6和JDK 7中的substring()方法
  • JS专题之继承
  • 半理解系列--Promise的进化史
  • 大快搜索数据爬虫技术实例安装教学篇
  • 前端面试之闭包
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 移动端唤起键盘时取消position:fixed定位
  • 鱼骨图 - 如何绘制?
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​马来语翻译中文去哪比较好?
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #pragma 指令
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (13)DroneCAN 适配器节点(一)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (function(){})()的分步解析
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)丶RabbitMQ的六大核心
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (一)80c52学习之旅-起始篇
  • (一)SpringBoot3---尚硅谷总结
  • *** 2003
  • .ai域名是什么后缀?
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 调用海康SDK以及常见的坑解释
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件