2025-02-25 学习记录--C/C++-用C语言实现删除字符串中的子串

news2025/2/26 15:24:26

C语言实现删除字符串中的子串

在这里插入图片描述

C语言中,你可以使用strstr函数来查找子串,然后用memmovestrcpy来覆盖或删除找到的子串。

一、举例 🐰

在这里插入图片描述

#include <stdio.h>  // 包含标准输入输出库,用于使用 printf 函数
#include <string.h> // 包含字符串处理库,用于使用 strstr 和 memmove 函数
#include <stdlib.h> // 包含标准库,用于使用 exit 函数

// 定义一个函数 removeSubstring,用于从字符串中删除子串
void removeSubstring(char *str, const char *sub) {
    char *pos = strstr(str, sub); // 使用 strstr 函数查找子串 sub 在字符串 str 中的位置
                                  // 如果找到,返回子串的起始地址;如果未找到,返回 NULL

    if (pos != NULL) { // 检查是否找到子串
        char *dest = pos + strlen(sub); // 计算子串 sub 之后的字符的起始地址
                                        // pos 是子串的起始地址,strlen(sub) 是子串的长度
                                        // dest 指向子串之后的字符

        memmove(pos, dest, strlen(dest) + 1); // 使用 memmove 函数将子串之后的字符移动到子串的位置
                                              // strlen(dest) + 1 表示移动的字节数(包括子串之后的字符和字符串结束符 '\0')
    } else {
        printf("Substring not found.\n"); // 如果没有找到子串,输出提示信息
        // exit(EXIT_FAILURE); // 可选:如果找不到子串,调用 exit 函数终止程序
    }
}

// 主函数
int main() {
    char str[] = "Hello, World!"; // 定义一个字符串 str,初始值为 "Hello, World!"

    removeSubstring(str, "World"); // 调用 removeSubstring 函数,从 str 中删除子串 "World"

    printf("Modified string: %s\n", str); // 输出修改后的字符串 str(删除子串后的结果)

    return 0; // 返回 0,表示程序正常结束
}

在这里插入图片描述

二、知识点 📚

(一)、C 库函数 - strstr() 🍭

C 标准库 - <string.h>
在这里插入图片描述

strstr()C 标准库中的一个字符串处理函数,用于在一个字符串中查找子字符串的第一次出现位置。

下面是 strstr() 函数的声明:👇🏻
char *strstr(const char *haystack, const char *needle);

  • strstr() 函数用于在字符串 haystack 中查找子字符串 needle第一次出现位置,不包含终止符 \0
    • 如果找到,则返回指向该位置的指针
    • 如果未找到,则返回 NULL
  • haystack – 要搜索的主字符串。
  • needle – 要查找的子字符串。

在这里插入图片描述

举例1 🌰
#include <stdio.h>  // 包含标准输入输出库,用于使用 printf 函数
#include <string.h> // 包含字符串处理库,用于使用 strstr 函数

int main()
{
    const char haystack[20] = "YOU CAN GET IT"; // 定义一个常量字符数组 haystack,初始值为 "YOU CAN GET IT"
                                                // haystack 是主字符串,用于在其中查找子串
    const char needle[10] = "CAN";              // 定义一个常量字符数组 needle,初始值为 "CAN"
                                                // needle 是要查找的子串
    char *ret;                                  // 定义一个字符指针 ret,用于存储 strstr 函数的返回值

    ret = strstr(haystack, needle);             // 使用 strstr 函数在 haystack 中查找子串 needle
                                                // 如果找到,返回子串的起始地址;如果未找到,返回 NULL

    printf("子字符串是: %s\n", ret);             // 输出找到的子字符串
                                                // 如果 ret 不为 NULL,输出从子串起始位置到主字符串末尾的内容
                                                // 如果 ret 为 NULL,输出未定义行为(可能为空或乱码)

    return 0;                                   // 返回 0,表示程序正常结束
}

在这里插入图片描述

举例2 🌰
#include <stdio.h>
#include <string.h>

int main() {
    const char *haystack = "Hello, world! This is a test string.";
    const char *needle = "world";

    // 在 haystack 中查找 needle
    char *result = strstr(haystack, needle);

    if (result != NULL) {
        printf("Substring found: %s\n", result);
    } else {
        printf("Substring not found.\n");
    }

    return 0;
}

在这里插入图片描述

(二)、C 库函数 - memmove() 🍭

C 标准库 - <string.h>
在这里插入图片描述

下面是 memmove() 函数的声明:👇🏻
void *memmove(void *str1, const void *str2, size_t n)

  • memmove() 函数用于实现从 str2 复制 n 个字符到 str1,该函数返回一个指向目标存储区 str1 的指针。。
  • str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  • str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
  • n – 要被复制的字节数。

在这里插入图片描述

举例1 🌰
#include <stdio.h>
#include <string.h>

int main ()
{
    const char dest[] = "oldstring";
    const char src[]  = "newstring";

    printf("Before memmove dest = %s, src = %s\n", dest, src);
    memmove(dest, src, 9); // 从 src 复制 9 个字符到 dest
    printf("After memmove dest = %s, src = %s\n", dest, src);

    return(0);
}

在这里插入图片描述

举例2 🌰
#include <stdio.h>
#include <string.h>

int main ()
{
    const char dest[] = "oldstring";
    const char src[]  = "newstring";

    printf("Before memmove dest = %s, src = %s\n", dest, src);
    memmove(dest, src, 3); // 从 src 复制 3 个字符到 dest
    printf("After memmove dest = %s, src = %s\n", dest, src);

    return(0);
}

在这里插入图片描述

(三)、C 库函数 - strcpy() 🍭

C 标准库 - <string.h>
在这里插入图片描述

下面是 strcpy() 函数的声明:👇🏻
char *strcpy(char *dest, const char *src)

  • strcpy() 函数用于实现把 src 所指向的字符串复制到 dest,该函数返回一个指向最终的目标字符串 dest 的指针。
  • dest – 指向用于存储复制内容的目标数组。
  • src – 要复制的字符串。

在这里插入图片描述

举例1 🌰
#include <stdio.h>  // 包含标准输入输出库,用于使用 printf 等函数
#include <string.h> // 包含字符串处理库,用于使用 memset 和 strcpy 等函数

int main()
{
    char src[40];       // 声明一个长度为 40 的字符数组 src,用于存储源字符串
    char dest[100];     // 声明一个长度为 100 的字符数组 dest,用于存储目标字符串

    memset(dest, '\0', sizeof(dest));  // 使用 memset 函数将 dest 数组的所有元素初始化为 '\0'(即字符串结束符)
    // sizeof(dest) 返回 dest 数组的总大小(100 字节)
    // 这一步确保 dest 数组是一个空字符串

    strcpy(src, "Where there is a will, there is a way."); // 使用 strcpy 函数将字符串 "Where there is a will, there is a way." 复制到 src 数组中
    strcpy(dest, src);                                     // 使用 strcpy 函数将 src 数组中的字符串复制到 dest 数组中

    printf("最终的目标字符串: %s\n", dest);  // 使用 printf 函数输出 dest 数组中的字符串
    // %s 是格式化字符串,表示输出一个字符串

    return 0;  // 返回 0,表示程序正常结束
}

在这里插入图片描述

举例2 🌰
#include <stdio.h>
#include <string.h>

int main ()
{
    char str1[]="Sample string";
    char str2[40];
    char str3[40];
    strcpy (str2,str1); // 使用 strcpy 函数将 str1 数组中的字符串复制到 str2 数组中
    strcpy (str3,"copy successful"); // 使用 strcpy 函数将字符串 "copy successful" 复制到 str3 数组中
    printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
    return 0;
}

在这里插入图片描述

(四)、C 库函数 - memset() 🍭

C 标准库 - <string.h>
在这里插入图片描述

下面是 memset() 函数的声明:👇🏻
void *memset(void *str, int c, size_t n)

  • memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值。该值返回一个指向存储区 str 的指针。
  • str – 指向要填充的内存区域的指针。
  • c – 要设置的值,通常是一个无符号字符。
  • n – 要被设置为该值的字节数。

在这里插入图片描述

举例1 🌰
#include <stdio.h>  // 包含标准输入输出库,用于使用 puts 等函数
#include <string.h> // 包含字符串处理库,用于使用 strcpy 和 memset 等函数

int main()
{
   char str[50];  // 声明一个长度为 50 的字符数组 str,用于存储字符串

   strcpy(str, "This is string.h library function");  // 使用 strcpy 函数将字符串 "This is string.h library function" 复制到 str 数组中

   puts(str);  // 使用 puts 函数输出 str 数组中的字符串(自动在末尾添加换行符)

   memset(str, '$', 7);  // 使用 memset 函数将 str 数组的前 7 个字符替换为 '$'
                         // 注意:memset 是按字节操作的,这里将前 7 个字节设置为 '$'

   puts(str);  // 再次使用 puts 函数输出修改后的 str 数组中的字符串

   return 0;  // 返回 0,表示程序正常结束
}

在这里插入图片描述

举例2 🌰
#include <stdio.h>  // 包含标准输入输出库,用于使用 printf 等函数
#include <string.h> // 包含字符串处理库,用于使用 memset 函数

int main() {
    char buffer[10];  // 声明一个长度为 10 的字符数组 buffer,用于存储字符串

    // 将 buffer 数组的前5个字节设置为字符 'A',并添加字符串终止符
    memset(buffer, 'A', 5);  // 使用 memset 函数将 buffer 数组的前5个字节设置为字符 'A'
    buffer[5] = '\0';        // 在第6个位置(索引5)添加字符串终止符 '\0',确保 buffer 是一个合法的 C 字符串
    printf("Buffer after memset: %s\n", buffer);  // 输出 buffer 数组中的字符串

    // 将 buffer 数组清零,使用 '\0' 替代 0
    memset(buffer, '\0', sizeof(buffer));  // 使用 memset 函数将 buffer 数组的所有字节设置为 '\0'(即清零)
                                           // sizeof(buffer) 返回 buffer 数组的总大小(10 字节)
    printf("Buffer after memset: %s\n", buffer);  // 再次输出 buffer 数组中的字符串(此时为空字符串)

    return 0;  // 返回 0,表示程序正常结束
}

在这里插入图片描述

(五)、C 库函数 - strlen() 🍭

C 标准库 - <string.h>
在这里插入图片描述

下面是 strlen() 函数的声明:👇🏻
size_t strlen(const char *str)

  • strlen() 函数用于实现 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。该函数返回字符串的长度。
  • str – 要计算长度的字符串。

在这里插入图片描述

#include <stdio.h>  // 引入标准输入输出库,用于使用 printf 等函数
#include <string.h> // 引入字符串处理库,用于使用 strcpy 和 strlen 等函数

int main() // 主函数,程序入口
{
    char str[50]; // 定义一个字符数组 str,用于存储字符串,最大长度为 49 个字符(最后一个字符是字符串结束符 '\0')
    int len;      // 定义一个整型变量 len,用于存储字符串的长度

    strcpy(str, "You can get it"); // 使用 strcpy 函数将字符串 "You can get it" 复制到字符数组 str 中

    len = strlen(str); // 使用 strlen 函数计算字符串 str 的长度,并将结果赋值给变量 len

    // 打印字符串及其长度
    // |%s| 表示格式化输出字符串,|%d| 表示格式化输出整数
    printf("|%s| 的长度是 |%d|\n", str, len);

    return 0; // 返回 0,表示程序正常结束
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306432.html

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

相关文章

【Linux】Ubuntu服务器的安装和配置管理

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周二了&#xff0c;哪吒的票房已经到了138亿了&#xff0c;饺子导演好样的&#xff01;&#xff01;每个人的成功都不是必然的&#xff0c;坚信自己现在做的事是可以的&#xff01;&#xff01;&#x1f606; 本文是有关Ubunt…

2.3做logstash实验

收集apache日志输出到es 在真实服务器安装logstash&#xff0c;httpd systemctl start httpd echo 666 > /var/www/html/index.html cat /usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/httpd #系统内置变量 cd /usr/local/…

pandas读取数据

pandas读取数据 导入需要的包 import pandas as pd import numpy as np import warnings import oswarnings.filterwarnings(ignore)读取纯文本文件 pd.read_csv 使用默认的标题行、逗号分隔符 import pandas as pd fpath "./datas/ml-latest-small/ratings.csv" 使…

ReentrantLock 用法与源码剖析笔记

&#x1f4d2; ReentrantLock 用法与源码剖析笔记 &#x1f680; 一、ReentrantLock 核心特性 &#x1f504; 可重入性&#xff1a;同一线程可重复获取锁&#xff08;最大递归次数为 Integer.MAX_VALUE&#xff09;&#x1f527; 公平性&#xff1a;支持公平锁&#xff08;按等…

java进阶专栏的学习指南

学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…

架构思维:架构的演进之路

文章目录 引言为什么架构思维如此重要架构师的特点软件架构的知识体系如何提升架构思维大型互联网系统架构的演进之路一、大型互联网系统的特点二、系统处理能力提升的两种途径三、大型互联网系统架构演化过程四、总结 引言 在软件开发行业中&#xff0c;有很多技术人可能会问…

vue3:vue3项目安装并引入Element-plus

一、安装Element-plus 1、安装语句位置 安装 | Element Plushttps://element-plus.org/zh-CN/guide/installation.html根据所需进行安装&#xff0c;这里使用npm包 2、找到项目位置 找到项目位置&#xff0c;在路径上输入cmd回车打开“运行”窗口 输入安装语句回车完成安装 …

java.2.25

1. 注释 ​ 注释是对代码的解释和说明文字。 Java中的注释分为三种&#xff1a; 单行注释&#xff1a; // 这是单行注释文字多行注释&#xff1a; /* 这是多行注释文字 这是多行注释文字 这是多行注释文字 */ 注意&#xff1a;多行注释不能嵌套使用。文档注释&#xff1a;…

VScode 开发

目录 安装 VS Code 创建一个 Python 代码文件 安装 VS Code VSCode&#xff08;全称&#xff1a;Visual Studio Code&#xff09;是一款由微软开发且跨平台的免费源代码编辑器&#xff0c;VSCode 开发环境非常简单易用。 VSCode 安装也很简单&#xff0c;打开官网 Visual S…

A Large Recurrent Action Model: xLSTM Enables Fast Inference for Robotics Tasks

奥地利林茨约翰开普勒大学机器学习研究所 ELLIS 小组&#xff0c;LIT 人工智能实验室奥地利林茨 NXAI 有限公司谷歌 DeepMind米拉 - 魁北克人工智能研究所 摘要 近年来&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;领域出现了一种趋势&#xff0c;…

计算机毕业设计SpringBoot+Vue.js学科竞赛管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Deep Seek-编码器

1. DeepSeek Coder 简介 DeepSeek Coder 由一系列代码语言模型组成,每个模型都在 2T 令牌上从头开始训练,其中 87% 的代码和 13% 的自然语言在中英文中组成。我们提供各种大小的代码模型,从 1B 到 33B 版本。每个模型都通过采用 16K 的窗口大小和额外的填空任务在项目级代码…

Android平台轻量级RTSP服务模块技术对接说明

一、技术背景 随着内网无纸化办公、电子教室等应用场景对超低延迟音视频传输需求的日益增长&#xff0c;为避免用户或开发者单独部署 RTSP 或 RTMP 服务&#xff0c;大牛直播 SDK 推出了轻量级 RTSP 服务 SDK。该 SDK 能够将本地音视频数据&#xff08;如摄像头、麦克风等&…

RoCEv2 高性能传输协议与 Lossless 无损网络

目录 文章目录 目录RoCERoCEv2 v.s. IBRoCEv2 协议栈RoCEv2 需要 Lossless NetworkLossless Network 拥塞控制技术网络拥塞的原因PFC 基于优先级的流量控制PFC Unfairness &#xff08;带宽分配不公平&#xff09;的问题PFC HOL&#xff08;队头拥塞&#xff09;的问题PFC Dead…

联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘

坏了的硬盘会自动亮黄灯。用一个空的新盘来替换&#xff0c;新盘最好不要有东西。但是有东西可能也没啥&#xff0c;因为我看 RAID 控制器里有格式化的选项 1. 从 IPMI 把服务器关机&#xff0c;电源键进入绿色闪烁状态 2. 断电&#xff0c;推开塑料滑块拉出支架&#xff0c;…

城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章

当艺术与科技相遇&#xff0c;会碰撞出怎样的火花&#xff1f;城电科技推出的光伏太阳花&#xff0c;以其独特的设计与智能化的功能&#xff0c;给出了答案。这款产品不仅具备太阳能发电的实用功能&#xff0c;更是一件充满科技属性的艺术性光伏产品&#xff0c;吸引了广泛关注…

基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

多智能体框架

多个不同的角色的Agent&#xff0c;共同完成一份复杂的工作。由一个统筹管理的智能体&#xff0c;自主规划多个智能体分别做什么&#xff0c;以及执行的顺序。 agent 应该包含的属性 执行特定任务 根据其角色和目标做出决策 能够使用工具来实现目标 与其他代理沟通和协作 保留…

C#中级教程(1)——解锁 C# 编程的调试与错误处理秘籍

一、认识错误&#xff1a;编程路上的 “绊脚石” 在 C# 编程中&#xff0c;错误大致可分为两类&#xff1a;语法错误和语义错误&#xff08;逻辑错误&#xff09;。语法错误就像是写作文时的错别字和病句&#xff0c;编译器一眼就能识别出来&#xff0c;比如变量名拼写错误、符…