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

从0开始的c++知识讲解之字符串(1)

作者作为新手,对于知识的讲解也是边输出内容也是边学习,如有缺陷,请多海涵,但同样,我会帮助你从新手视角看到新手的疑惑,并帮助你解决此疑惑

一,开宗明义,立意先行

        string在C++里有可变性,为可变对象,他初始化后运行修改,比如拼接,替换,重新赋值,删除中间某个字符

         但是在c#和Java里面不同,里面为不可变对象,具体内容涉及那边内容

二,头文件与命名空间

头文件 :# include <string>和  # include <string.h> 和 # include <cstring> 的区别

    1,# include <string.h>

        (1)c语言标准库,c语言头文件,出来c风格字符串,以\0结尾的char数组

        (2)提供的是c字符操作函数,如strcpy,strlen

          (3) c++里面兼容可使用,但不推荐,c++有他自己的

2, # include <cstring>

        (1)c++对c标准库的包装,可以理解为对标上面:# include <string.h>的兼容版,与其功能类似,但是遵循c++的命名规范,所以c++应该用这个

         (2)提供strlen,strcpy函数

3,# include <string>

        (1)c++标准库,用来定义面向对象的字符串类 std::string,简单说定义字符串string,就要导入这个

      (2)提供length(),find(),substr()等函数

三,字符串的简单不涉及函数使用方式

   (1)可通过加号拼接,之后可以组合成 s +=" 新加字符串",将原来字符与新字符拼接,s为原来字符串

    (2)可以重新对字符串赋值

3.append() 追加字符串

 如 s.append("  www ")

四,关于字符串的函数介绍(重点):

 1,长度获取---length()与 size()

(1)c语言里面的strlen(s)对标c++里面的 s.length() 和 s.size(),s为一组字符串,他们的作用都是获取字符串长度。至于python则比较简单,为len()

    c++里面的length()和 size()你可以看成完全等价关系,都返回字符串占用的字节,只是size与STL容器有关系,不用过多区分

知识补充:length()只能获得字符串长度,无法获取字符型数组长度,而size()也不行,但是只能在栈的字符型数组取长度。但是strlen()可用获取字符型数组长度。

2,删除字符内容--erase()(英文意思:v.抹去;删除)

       (1)erase()函数,需要包含头文件<string>

          (2)用法:对象.erase(起始下标,删除数量)

              **注意:不包含起始下标,从起始下标后一个下标开始删除,如果遇到空格,也算入内会删除

  输出结果:

  输出结果: 

    输出结果: 

4,指定位置插入--insert()(英文意思:插入)

      (1)需要包含头文件<string>

      (2)用法:被插入对象.insert(下标,想插入的字符)

             * *会在要插入的下标处插入,从下标开始往后挪,插入的数据是在下标前的间隙里插入,如过下标后是空格,记住把空格也当成一个字符串,他会往后挪

        输出结果: 

5,反转字符串--reverse()   (英文意思:v.反转;颠覆;n.相反 adj.相反的 )

      (1)需包含<algorithm>  头文件(英文意思:算法)

      (2)用法: reverse(对象.begin(),s.end())

            ** 我知道你的疑惑,对象.begin()的括号里面不能填参数,他的作用是获取字符串首个字符起始位置,如果要改变位置,要在后面加你想起始的位置:对象.begin()+n,下图可视

         

  输出结果: 

   输出结果:

6,字符末尾追加单个字符--push_back()

    用法: 对象.push_back( ' 要追加的单个字符 ' )

  输出结果: 

7.查找字符串中字符位置--find()

   接收对象=目标对象.find('查找的字串')  可以查找多个字符的字符串,加上 “   ” 双引号

    输出结果: 

8,替换--replace()

注意:这是直接对原字符串修改

9.提取子字符串--substr()    (英文意思:字符截取)

用法:接收对象 =目标对象.substr(起始点下标,提取数量,若不写默认后面全部)

六,高级字符串的操作(超重点)

引言: 需先了解一下缓冲区的概率,对于新手来说比较模糊,特别是对于我这个之前学python头脑简单,cpp知识文盲的人和我一类的人。

概括: 缓冲区就像现实世界中的「快递分拣站」,是程序与外部设备(键盘、屏幕、文件等)之间的临时数据中转站。它存在的核心目的是:​减少频繁的慢速IO操作,提升效率。(意思是io是频繁的接收输入与频繁的输出)

你可能好奇为什么,把电脑想象成一个快递站点,你今天将会断断续续的收到关于一个人的一百个快递,也要将这100个快递今天送出去,你这时有两种方案,法一:收到一个送一个。法二:收到10个后再统一一起去送。

你会怎么选:

分析法一:你断断续续的收到了1个,再送出一个,持续了10次,这时快递员心里想着大概是关于m之类的不好的话,他将快递接收到站点总共跑了10,他现在还要一个一个送出去还要跑10次,每次将快递送给同一个人同一个地方

分析法二:你断断续续的收到了10个,再一起送出去10个,虽然快递员将快递接收到站点总共跑了10次,但他送快递只需要跑一次,将这10个快递送到一个人手上就行,其他时间自己就可以休息一下,这对应了电脑,接收你的输入的指令,你输入完毕了,它作为电脑会慢慢接收你输入的指令,他此时也有两种选择,①它每接收并识别到了你指令的一个字就输出一次,总共10次接收和10次输出,②或者是它每接收并识别到了你指令的十个字再输出一次,总10次接收和一次输出,而这也对应了缓冲区的存在

1,#include<iostream>讲解:
      (1)  iostream 全称是 input / output stream ( input 输入   output  输出     stream    n,流;小溪 v.流动 )

     (2)C++ 中的 iostream 是标准输入输出库的核心组件,基于流(Stream)​的概念实现数据的输入输出操作。以下是其关键知识点和用法详解:


1. 头文件与标准流对象

  • 头文件​:#include <iostream>
  • 标准流对象​:
    • std::cin:标准输入流(istream 类型),通常对应键盘输入。
    • std::cout:标准输出流(ostream 类型),对应控制台输出。
    • std::cerr/std::clog:标准错误流,cerr 无缓冲,clog 有缓冲。

2. 输入输出运算符

  • 运算符重载​:
    • <<(插入运算符):向流中写入数据。
      示例:cout << "Hello, " << 42 << endl;
    • >>(提取运算符):从流中读取数据。
      示例:int x; cin >> x;
  • 链式调用​:运算符返回流对象的引用,支持连续操作。

3. 流操纵器(Manipulators)​

  • 常用操纵器​:
    • std::endl:换行并刷新缓冲区。
    • std::hex/std::dec:以十六进制/十进制格式输出。
    • std::setw(n)(需 <iomanip>):设置输出宽度为 n
      示例:cout << setw(5) << 10; 输出 10

4. 类型安全与错误处理

  • 类型安全​:无需格式说明符(如 %d),自动根据变量类型处理。
  • 错误状态检测​:
    • cin.fail():检查输入是否失败(如类型不匹配)。
    • cin.clear():清除错误状态。
    • cin.ignore():清空输入缓冲区。
      示例:输入错误后恢复:

cin.fail()是遇到以下问题时的情况:

接收的数据类型与输入的数据类型不一样时

cin.clear() 的作用是重置输入流的状态标志,让因错误而中断的输入流恢复可用。当输入操作失败(例如用户输入了字母,但程序期望数字),输入流会进入错误状态,导致后续所有输入操作被跳过。此时必须用 clear() 重置状态,才能继续读取数据。但是此时他的错误数据被储存在了缓冲区,因为它是在缓冲区存完再识别,缓冲区并未清理干净,所有需要cin.ignore()去专门清理缓冲区,而cin.ignore()用法如下

在 C++ 中,<limits> 头文件提供了 ​std::numeric_limits 模板类,用于获取各种数据类型极值(如最大值、最小值)。它是处理数值边界流操作时的重要工具,尤其在输入输出中用于安全地控制缓冲区。 标准形式是  numeric_limits<要获取的数据类型>::里面函数

在上面代码中  numeric_limits<stream>::max() 其意思为表示在流类型里面能表示的最大的数字,即对缓冲区里面所有内容通通升天超度掉(清空)

#include <limits>
using namespace std;numeric_limits<T>::max();      // 类型 T 的最大值
numeric_limits<T>::min();      // 类型 T 的最小值(整数为最小负值,浮点为最小正值)
numeric_limits<T>::lowest();   // 类型 T 的最小值(浮点的负无穷方向)
numeric_limits<T>::epsilon(); // 浮点类型的精度(机器 epsilon)

 当然,也能更简单

ignore里面第一个参数填要清空的字符串数量,第二个参数填结束位置以识别到\n换行结束

不要忽略我上面讲的  cin.fail()和 cin.clear() 和 cin.ignore() 的用法,之后你刷字符串的题目,你到时候看一些大神的解法还会回来的

2,经过上面讲解,相信你已经快领悟到字符串的秒处了,接下来,还有更重要的#include<sstream>

C++ 中的 <sstream> 头文件提供了字符串流(String Stream)​功能,允许将字符串作为流来处理,实现内存中的格式化输入输出操作。它比 C 风格的 sscanf/sprintf 更安全、更灵活,是处理字符串与数据类型转换的利器。

这对于作者来说,将这个有许多难度,之后再总结后会发在第二期 ,真的对不起

相关文章:

  • 体系学习1:C语言与指针1——预定义、进制打印、传参为数组
  • 【dify—7】文本生成应用实战——学员周报生成
  • 多模态大语言模型arxiv论文略读(五十二)
  • LabVIEW异步调用VI介绍
  • 【软件设计师:复习】上午题核心知识点总结(一)
  • FPGA中级项目8———UART-RAM-TFT
  • 数据结构——树(中篇)
  • Python控制语句全解析:用法、案例与注意事项
  • Redis实现分布式锁
  • 2025五一杯A题五一杯数学建模思路代码文章教学:支路车流量推测问题
  • python类私有变量
  • 【2025最新面经】暑期实习常问知识点
  • 简单句练习--语法基础
  • Python Cookbook-6.12 检查一个实例的状态变化
  • C++11新的特性
  • ZYNQB笔记(十六):AXI DMA 环路测试
  • 开发板型号 ESP32-DevKitC-32模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3
  • 【AI论文】仅通过一个训练样本对大型语言模型进行推理的强化学习
  • RocketMQ常见面试题一
  • Python PyTorch库【机器学习框架】全面深入讲解与实践 入选【全站综合热榜第四】【领域内容榜第一】
  • 《水饺皇后》领跑五一档票房,《哪吒2》上座率仍居第一
  • 西湖大学2025年上海市综合评价招生简章发布
  • “译通天下·言立寰宇”:华东师大翻译家的精神传承
  • 图忆|上海车展40年:中国人的梦中情车有哪些变化(上)
  • 关于“十五五”,在上海召开的这场座谈会释放最新信号
  • 中央网信办部署开展“清朗·整治AI技术滥用”专项行动