[C语言日寄] 字符串操作函数的使用及其拓展

在这里插入图片描述

【作者主页】siy2333
【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是进阶开发者,这里都能满足你的需求!
【食用方法】1.根据题目自行尝试 2.查看基础思路完善题解 3.学习拓展算法
【Gitee链接】资源保存在我的Gitee仓库:https://gitee.com/siy2333/study


文章目录

  • 前言
  • 题目引入
  • 知识点分析
    • 1. 字符串的基本概念
    • 2. 常用字符串操作函数
      • (1)字符串拷贝函数:`strcpy()`
      • (2)字符串连接函数:`strcat()`
      • (3)字符串比较函数:`strcmp()`
      • (4)字符串长度函数:`strlen()`
      • (5)字符串查找函数:`strstr()`
    • 3. 字符串操作函数的底层实现
      • (1)`strcpy()` 的实现
      • (2)`strlen()` 的实现
  • 注意事项
    • 1. 字符串数组的空间大小
    • 2. 字符串的终止符 `\0`
    • 3. 避免使用 `gets()` 函数
    • 4. 字符串函数的返回值
  • 拓展应用
    • 1. 字符串反转
    • 2. 字符串加密
    • 3. 字符串分割
    • 4. 字符串去重
  • 总结


前言

在C语言中,字符串是程序设计中不可或缺的一部分。C语言本身并没有提供专门的字符串类型,而是通过字符数组来实现字符串操作。为了方便对字符串进行处理,C语言标准库提供了丰富的字符串操作函数。今天,我们就通过一个简单的程序来深入探讨字符串操作函数的使用,以及它们在C语言中的重要性。


题目引入

下面是一个简单的程序,它的输出结果是:( )

#include <stdio.h>
#include <string.h>void print_string(const char *str) {printf("%s\n", str);
}int main() {char str1[20] = "Hello";char str2[20] = "World";strcat(str1, str2);print_string(str1);return 0;
}

A. Hello
B. World
C. HelloWorld
D. Hello World

在接下来的文章中,我们会一起把字符串操作函数的知识与题目结合起来,学习这一知识点。


知识点分析

1. 字符串的基本概念

在C语言中,字符串是以字符数组的形式存储的,以空字符(\0)作为结束标志。例如:

char str[] = "Hello";

这里,str 是一个字符数组,包含 6 个字符:'H''e''l''l''o' 和一个空字符 '\0'。空字符是字符串的终止符,用于标识字符串的结束。

2. 常用字符串操作函数

C语言标准库 <string.h> 提供了丰富的字符串操作函数,以下是一些常用的函数及其功能:

(1)字符串拷贝函数:strcpy()

strcpy() 函数用于将一个字符串拷贝到另一个字符串中。其函数原型为:

char *strcpy(char *dest, const char *src);
  • dest 是目标字符串,src 是源字符串。
  • 该函数会将 src 中的字符串(包括终止符 \0)拷贝到 dest 中。
  • 返回值是目标字符串的首地址。

示例:

char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest); // 输出:Hello

(2)字符串连接函数:strcat()

strcat() 函数用于将一个字符串连接到另一个字符串的末尾。其函数原型为:

char *strcat(char *dest, const char *src);
  • dest 是目标字符串,src 是源字符串。
  • 该函数会将 src 中的字符串(不包括终止符 \0)连接到 dest 的末尾。
  • 返回值是目标字符串的首地址。

示例:

char str1[20] = "Hello";
char str2[] = "World";
strcat(str1, str2);
printf("%s\n", str1); // 输出:HelloWorld

(3)字符串比较函数:strcmp()

strcmp() 函数用于比较两个字符串的大小。其函数原型为:

int strcmp(const char *str1, const char *str2);
  • 如果 str1str2 相等,返回 0。
  • 如果 str1 小于 str2,返回负值。
  • 如果 str1 大于 str2,返回正值。

示例:

char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
printf("%d\n", result); // 输出:负值

(4)字符串长度函数:strlen()

strlen() 函数用于计算字符串的长度(不包括终止符 \0)。其函数原型为:

size_t strlen(const char *str);

示例:

char str[] = "Hello";
size_t length = strlen(str);
printf("%zu\n", length); // 输出:5

(5)字符串查找函数:strstr()

strstr() 函数用于在一个字符串中查找另一个字符串的首次出现位置。其函数原型为:

char *strstr(const char *haystack, const char *needle);
  • haystack 是被搜索的字符串,needle 是要查找的子字符串。
  • 如果找到子字符串,返回子字符串的首地址;否则返回 NULL

示例:

char str[] = "Hello World";
char *result = strstr(str, "World");
if (result) {printf("Found: %s\n", result); // 输出:Found: World
} else {printf("Not found\n");
}

3. 字符串操作函数的底层实现

为了更好地理解字符串操作函数的工作原理,我们可以简单分析一下它们的底层实现。

(1)strcpy() 的实现

char *strcpy(char *dest, const char *src) {char *tmp = dest;while ((*tmp++ = *src++) != '\0');return dest;
}
  • 通过一个循环,逐个拷贝源字符串中的字符到目标字符串中,直到遇到终止符 \0
  • 返回目标字符串的首地址。

(2)strlen() 的实现

size_t strlen(const char *str) {const char *tmp = str;while (*tmp++);return tmp - str;
}
  • 通过一个循环,逐个遍历字符串中的字符,直到遇到终止符 \0
  • 返回字符串的长度。

注意事项

1. 字符串数组的空间大小

在使用字符串操作函数时,必须确保目标字符串数组有足够的空间来存储结果。例如,在使用 strcpy()strcat() 时,目标字符串数组的大小必须大于或等于源字符串的长度加上终止符 \0 的大小。

错误示例:

char src[] = "Hello World";
char dest[5];
strcpy(dest, src); // 错误:dest 空间不足

正确示例:

char src[] = "Hello World";
char dest[20];
strcpy(dest, src); // 正确:dest 空间足够

2. 字符串的终止符 \0

在处理字符串时,必须确保字符串以终止符 \0 结尾。否则,可能会导致未定义行为,例如在使用 strlen()printf() 时,程序可能会读取超出字符串范围的内存。

错误示例:

char str[5] = {'H', 'e', 'l', 'l', 'o'};
printf("%s\n", str); // 错误:str 没有终止符

正确示例:

char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("%s\n", str); // 正确:str 有终止符

3. 避免使用 gets() 函数

gets() 函数用于从标准输入读取一行字符串,但它不会检查目标缓冲区的大小,容易导致缓冲区溢出。因此,gets() 函数已经被废弃,建议使用更安全的替代函数,如 fgets()

错误示例:

char str[20];
gets(str); // 错误:容易导致缓冲区溢出

正确示例:

char str[20];
fgets(str, sizeof(str), stdin); // 正确:更安全的替代

4. 字符串函数的返回值

在使用字符串函数时,需要注意它们的返回值。例如,strcpy()strcat() 返回目标字符串的首地址,而 strcmp() 返回一个整数值。正确使用返回值可以避免潜在的错误。

示例:

char str1[20] = "Hello";
char str2[] = "World";
char *result = strcat(str1, str2);
printf("%s\n", result); // 输出:HelloWorld

拓展应用

1. 字符串反转

字符串反转是一个常见的应用场景,可以通过字符串操作函数实现。以下是一个简单的字符串反转函数:

#include <stdio.h>
#include <string.h>void reverse_string(char *str) {int length = strlen(str);for (int i = 0; i < length / 2; i++) {char temp = str[i];str[i] = str[length - i - 1];str[length - i - 1] = temp;}
}int main() {char str[] = "Hello";reverse_string(str);printf("%s\n", str); // 输出:olleHreturn 0;
}

2. 字符串加密

字符串加密可以通过简单的字符替换实现。以下是一个简单的加密函数,将每个字符向后移动一个位置(字母表循环):

#include <stdio.h>
#include <string.h>void encrypt_string(char *str) {int length = strlen(str);for (int i = 0; i < length; i++) {if (str[i] >= 'a' && str[i] <= 'z') {str[i] = (str[i] - 'a' + 1) % 26 + 'a';} else if (str[i] >= 'A' && str[i] <= 'Z') {str[i] = (str[i] - 'A' + 1) % 26 + 'A';}}
}int main() {char str[] = "Hello";encrypt_string(str);printf("%s\n", str); // 输出:Ifmmpreturn 0;
}

3. 字符串分割

字符串分割可以通过 strtok() 函数实现。以下是一个简单的字符串分割示例,将字符串按空格分割:

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello World This is C";char *token = strtok(str, " ");while (token) {printf("%s\n", token);token = strtok(NULL, " ");}return 0;
}

4. 字符串去重

字符串去重可以通过遍历字符串并删除重复字符实现。以下是一个简单的字符串去重函数:

#include <stdio.h>
#include <string.h>void remove_duplicates(char *str) {int length = strlen(str);for (int i = 0; i < length; i++) {for (int j = i + 1; j < length; j++) {if (str[i] == str[j]) {for (int k = j; k < length - 1; k++) {str[k] = str[k + 1];}length--;j--;}}}
}int main() {char str[] = "aabbccddeeff";remove_duplicates(str);printf("%s\n", str); // 输出:abcdefreturn 0;
}

总结

字符串操作函数是C语言中非常重要的工具,它们可以帮助我们高效地处理字符串。
关注窝,每三天至少更新一篇优质c语言题目详解~

[专栏链接QwQ] :⌈c语言日寄⌋CSDN
[关注博主ava]:siy2333
感谢观看~ 我们下次再见!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)

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

ssm_mysql_暖心家装平台

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…

地下井室可燃气体监测装置:守护地下安全,防患于未“燃”!

在城市的地下&#xff0c;隐藏着无数的燃气管道和井室&#xff0c;它们是城市基础设施建设的重要部分&#xff0c;燃气的使用&#xff0c;给大家的生活提供了极大的便利。在便利生活的背后&#xff0c;也存在潜在的城市安全隐患。 近年来&#xff0c;地下井室可燃气体泄漏事故…

EasyCVR平台赋能农业产业园:AIoT驱动的视频监控与大数据分析解决方案

随着现代农业的快速发展&#xff0c;农业产业园区的规模不断扩大&#xff0c;管理复杂度也随之增加。为了提高农业生产效率、保障农产品质量安全、实现精细化管理和智能化运营&#xff0c;视频信息化建设成为现代农业产业园的重要发展方向。EasyCVR作为一款功能强大的视频监控与…

【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成

标题&#xff1a;《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目&#xff1a;https://zju3dv.github.io/StarGen 来源&#xff1a;商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…

STM32 进阶 定时器

在stm32中定时器大概分为4类 1、系统定时器&#xff1a;属于arm内核&#xff0c;内嵌在NVIC中 2、高级定时器&#xff1a;可以用来刹车和死区 3、通用定时器&#xff1a;可以用来输出pwm方波 4、基本定时器&#xff1a;只能记数 系统定时器注意&#xff1a; 1、系统定时器…

day21-API(算法,lambda,练习)

常见的七种查找算法&#xff1a; ​ 数据结构是数据存储的方式&#xff0c;算法是数据计算的方式。所以在开发中&#xff0c;算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词&#xff0c;如果各位铁粉有疑惑&#xff0c;可以先看一下哥们后面录制的数据结构…

正则表达式梳理(基于python)

正则表达式&#xff08;regular expression&#xff09;是一种针对字符串匹配查找所定义的规则模式&#xff0c;独立于语言&#xff0c;但不同语言在实现上也会存在一些细微差别&#xff0c;下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…

Java多线程与高并发专题——为什么 Map 桶中超过 8 个才转为红黑树?

引入 JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个特点&#xff1a;最开始的 Map 是空的&#xff0c;因为里面没有任何元素&#xff0c;往里放元素时会计算 hash 值&#xff0c;计算之后&#xff0c;第 1 个 value 会首先占用一个桶&#xff08;也称为槽点&#xff…

Llama-Factory框架下的Meta-Llama-3-8B-Instruct模型微调

目录 引言 Llama - Factory 训练框架简介&#xff1a; Meta - Llama - 3 - 8B - Instruct 模型概述&#xff1a; Lora 方法原理及优势&#xff1a; 原理 优势 环境准备: 部署环境测试&#xff1a; 数据准备&#xff1a; 模型准备&#xff1a; 模型配置与训练&#xff1…

介绍一个能支持高带宽的EDID编辑软件

软件名称叫980 Manager 4.24.16&#xff0c;安装后的图标如下。   软件可以去此地址下载https://download.csdn.net/download/cjie221/90459603&#xff0c;下载后需解压&#xff0c;运行.msi文件安装。   安装后&#xff0c;打开软件&#xff0c;首先会弹出这个界面&…

2025年Cursor最新安装使用教程

Cursor安装教程 一、Cursor下载二、Cursor安装三、Cursor编辑器快捷键(1) 基础编辑快捷键(2) 导航快捷键(3) 其他常用快捷键 一、Cursor下载 Cursor官方网站&#xff08;https://www.cursor.com/ &#xff09; 根据自己电脑操作系统选择对应安装包 二、Cursor安装 下载完成后…

[内网安全] Windows 本地认证 — NTLM 哈希和 LM 哈希

关注这个专栏的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;SAM 文件 & Windows 本地认证流程 0x0101&#xff1a;SAM 文件简介 Windows 本地账户的登录密码是存储在系统本地的 SAM 文件中的&#xff0c;在登录 Windows 的时候&am…

pt-archiver删除数据库的数据表/各种报错类型

这篇帖子是前面文的一部分延申 mysqlimport导入一亿数据的csv文件/一行命令删除表-CSDN博客 如需转载&#xff0c;标记出处 目录 pt-archiver命令格式 如果执行后出现下面报错 1&#xff09;Cannot find an ascendable index in table at /usr/bin/pt-archiver line 3233. …

开发环境搭建-06.后端环境搭建-前后端联调-Nginx反向代理和负载均衡概念

一.前后端联调 我们首先来思考一个问题 前端的请求地址是&#xff1a;http://localhost/api/employee/login 后端的接口地址是&#xff1a;http://localhost:8080/admin/employee/login 明明请求地址和接口地址不同&#xff0c;那么前端是如何请求到后端接口所响应回来的数…

自学Linux系统软件编程第八天

并发服务器&#xff1a; 服务器在同一时刻可以响应多个客户端的请求。 UDP&#xff1a;无连接 单循环服务器&#xff1a;服务器同一时刻只能响应一个客户端的请求。 TCP&#xff1a;有连接 构建TCP并发服务器&#xff1a; 让TCP服务端具备同时响应多个客户端的能力。 方法…

FusionInsight MRS云原生数据湖

FusionInsight MRS云原生数据湖 1、FusionInsight MRS概述2、FusionInsight MRS解决方案3、FusionInsight MRS优势4、FusionInsight MRS功能 1、FusionInsight MRS概述 1.1、数据湖概述 数据湖是一个集中式存储库&#xff0c;允许以任意规模存储所有结构化和非结构化数据。可以…

.NET 10首个预览版发布:重大改进与新特性概览!

前言 .NET 团队于2025年2月25日发布博文&#xff0c;宣布推出 .NET 10 首个预览版更新&#xff0c;重点改进.NET Runtime、SDK、Libraries 、C#、ASP.NET Core、Blazor 和.NET MAUI 等。 .NET 10介绍 .NET 10 是 .NET 9 的后继版本&#xff0c;将作为长期支持维护 &#xff…

HTTP 黑科技

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

C++20 模块:告别头文件,迎接现代化的模块系统

文章目录 引言一、C20模块简介1.1 传统头文件的局限性1.2 模块的出现 二、模块的基本概念2.1 模块声明2.2 模块接口单元2.3 模块实现单元 三、模块的优势3.1 编译时间大幅减少3.2 更好的依赖管理3.3 命名空间隔离 四、如何使用C20模块4.1 编译器支持4.2 示例项目4.3 编译和运行…