【C++基础】字符串/字符读取函数解析

最近在学C++以及STL,打个基础

参考:

c++中的char[] ,char* ,string三种字符串变量转化的兼容原则
c++读取字符串和字符的6种函数

字符串结构

首先明确三种字符串结构的兼容关系:string>char*>char []

  • string最灵活,内置增删查改函数和运算符
  • char*可以改变指向内容(改变记录的地址),还算灵活,
  • char[]是const类型,内容即记录的地址不可以变(指向空间的内容可以修改),纯粹的数组

在后续的函数中,string也会对char有兼容。在实际应用中优先把char转string,极个别要用到char*的就反向转换,string.c_str()函数会返回一个指向string储存字符串的const char*指针,但要注意这不是拷贝,如果要复制一份(也就是转换格式),就要用strcpy(c,s.c_str())拷贝副本到c里面

读取函数辨析

我将读入函数分成如下几类:

  1. 常用的:
    • char ch=cin.get() ,相当于char ch=getchar(),单字符读取,来者不拒
    • cin>>char* ch ,相当于sacnf("%s",char* ch) ,一般读取,清理 最开始的连续分隔符,读取字符串后遇到任意分隔符停止,且保留后续分隔符在缓冲区
  2. 定界读取,两个函数都会丢弃 结尾分隔符
    • cin.getline(char* ch,总长度,结束字符='\n'),定界读取,遇到自定义分隔符停止,丢弃分隔符,总长度含\0。注意,此总长度实际上并不会限制读入,如下图,会一次性读入1234567,之后丢弃超出长度的内容
    • getline(数据源,string),定界读取,遇到\n停止,丢弃分隔符。注意,此函数来自string库,第二个参数必须是string类,其长度不限,更加灵活安全
  3. 定长读取,但是因为还会受到\n分隔符影响,实际不太好用
    • cin.get(arr,总长度),定长读取,总长度含\0。注意:此函数无法连用,遇到\n会停止,关键是其不清理\n,如果要接下一个需要先清理\n
    • fgets(char*,总长度,数据源),定长读取,遇到\n会读入并停止。注意:此函数会读入\n,一般场景并不好用,不过可以放心连用。
    • gets(char*),效果同getline,但没有string的自动扩容机制,也没有cin.getline的强制限制截断长度,所以不安全,不用
相关推荐
2401_8920709819 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei20 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
云烟成雨TD20 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
小O的算法实验室20 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
于慨20 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg32132120 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald20 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川20 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月20 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming66620 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter