当前位置: 首页 > 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 更安全、更灵活,是处理字符串与数据类型转换的利器。

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


http://www.mrgr.cn/news/100872.html

相关文章:

  • 使用MGeo模型高精度实现文本中地址识别
  • LeetCode —— 94. 二叉树的中序遍历
  • 洛谷题目:P10480 可达性统计 题解(本题简)
  • PostgreSQL:pgAdmin 4 使用教程
  • Android12 Rom定制设置默认语言为中文
  • Stm32 烧录 Micropython
  • 虚幻商城 Quixel 免费资产自动化入库(2025年版)
  • w~大模型~合集14
  • 腾讯元宝桌面客户端:基于Tauri的开源技术解析
  • Java集合框架终极指南:从基础到高级应用
  • 超全SpringMVC知识点!!(万字总结)
  • UI设计之photoshop学习笔记
  • Java ResourceBundle 资源绑定详解
  • 国标GB28181平台EasyGBS未来研发方向在哪?
  • 【RAG 框架部署】LangChain-Chatchat (原 Langchain-ChatGLM) + Ollama
  • AI驱动的决策智能系统(AIDP)和自然语言交互式分析
  • systemd和OpenSSH
  • 玩转MCP
  • 逻辑回归之参数选择:从理论到实践
  • 【Unity】MVC的简单分享以及一个在UI中使用的例子