[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);
- 如果
str1和str2相等,返回 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
感谢观看~ 我们下次再见!!
相关文章:
[C语言日寄] 字符串操作函数的使用及其拓展
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
用Python的Pandas库解锁数据科学:从入门到实战
用Python的Pandas库解锁数据科学:从入门到实战 引言 Python的Pandas库(名称源自"Panel Data")作为数据科学生态系统的基石,凭借其强大的数据结构和灵活的操作功能,已成为全球超过90%数据工作者的首选工具。…...
利率债、信用债、可转债区别与优势
利率债、信用债、城投债和可转债是债券市场的主要品种,它们在发行主体、风险收益特征和投资优势上各有不同。以下是它们的区别和优势: 1. 利率债 定义:利率债是由政府或政府支持的机构发行的债券,主要包括国债、政策性金融债&…...
12、Vue 生命周期各阶段及任务
Vue 2 生命周期各阶段及任务 创建阶段 beforeCreate 此时实例刚刚初始化,数据观测(data)和 event/watcher 事件配置还未开始。通常在此阶段无法访问 data 中的数据和 methods 中的方法。可以进行一些与 Vue 实例无关的全局初始化操作&#x…...
AI进化太快,建立完善的AI理论迫在眉睫
如今的AI用日新月异来形容都毫不夸张。DeepSeek的热度还没降,Manus 又火了。随着AI越来越强大且进化速度越来越快,建立完善的AI理论迫在眉睫。 虽然AI是人类创造的,但是我们其实没有完全理解其原理。深度学习本质上还是一个黑盒,…...
MATLAB程序介绍,三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波
本文所述的MATLAB代码为三维的交互式多模型(IMM)滤波器,结合了匀速直线运动(CV模型)和匀速圆周运动(CT模型)的状态估计。使用扩展卡尔曼滤波(EKF)来处理状态更新与观测数…...
[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑
参考原文:[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗?是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱?现在,这些问题通通能解决!Deskflow 软件闪亮登…...
【leetcode hot 100 48】旋转图像
方法一:(原地旋转)对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。matrix[row][col]在旋转后的新位置为matrix[col][n−row−1]。只要旋转四次就能回到原点。 class Solution {public vo…...
K8S高可用集群-小白学习之二进制部署(ansible+shell)
一.K8S高可用集群配置概述 序言:本文从一个小白的视角进行K8S的研究和部署,采用二进制的方式是为了更清楚了分解部署流程及了解这个集群是怎么运作的,加上ansible+shell是方便在这个过程中,遇到了问题,我们可以不断的快速重复部署来测试和研究问题的所在点,本文的架构图…...
【哇! C++】类和对象(三) - 构造函数和析构函数
目录 一、构造函数 1.1 构造函数的引入 1.2 构造函数的定义和语法 1.2.1 无参构造函数: 1.2.2 带参构造函数 1.3 构造函数的特性 1.4 默认构造函数 二、析构函数 2.1 析构函数的概念 2.2 特性 如果一个类中什么成员都没有,简称为空类。 空类中…...
利用Ollama+AnythingLLM+本地向量数据库Milvus+本地DeepSeek大模型实现知识库的搭建
1. Ollama的搭建 基本介绍 Ollama是一个支持在Windows、Linux和MacOS上本地运行大语言模型的工具。它允许用户非常方便地运行和使用各种大语言模型,比如Qwen模型等。用户只需一行命令就可以启动模型。 Ollama 下载:https://ollama.com/download Ollama 官方主页&a…...
攻防世界WEB(新手模式)19-file_include
先进行代码分析 include("./check.php");:包含并执行当前目录下的check.php文件,通常用于引入一些通用的函数、类或配置信息。if(isset($_GET[filename])):检查是否通过 GET 请求传递了名为filename的参数。如果传递了filename参数…...
Facebook 的隐私保护数据存储方案研究
Facebook 的隐私保护数据存储方案研究 在这个信息爆炸的时代,数据隐私保护已成为公众关注的热点。Facebook,作为全球最大的社交媒体平台之一,承载着海量用户数据,其隐私保护措施和数据存储方案对于维护用户隐私至关重要。本文将深…...
app UI自动化测试框架都包含哪些内容?
UI自动化测试框架是指用于自动化执行用户界面(UI)相关测试的工具和库。它们可以帮助开发团队提高测试效率、发现和解决应用程序中的问题,并确保应用程序的正确性和稳定性。下面将详细介绍一个完整的UI自动化测试框架应该具备的内容。 1. 测试环境配置 UI自动化测试框…...
C++ 中 `shared_ptr` 的用法及常见陷阱解析
shared_ptr 是 C 标准库(<memory> 头文件)中提供的一种智能指针,用于管理动态分配的内存。它通过引用计数(reference counting)来实现多个 shared_ptr 对象共享同一块内存的所有权。当最后一个 shared_ptr 被销毁…...
Android+SpringBoot的老年人健康饮食小程序平台
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 我将从经济、生活节奏、技术融合等方面入手,详细阐述居家养老管理模式兴起的…...
ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)
目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点(来自局部关键帧)UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…...
视频格式有哪些视频格式汇总
视频格式是指视频文件的编码和封装方式,不同的格式适用于不同的应用场景。以下是一些常见的视频格式及其特点: 1. MP4(MPEG-4 Part 14) 特点:最流行的视频格式之一,支持多种视频编码标准(如H.…...
【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
https://time.geekbang.org/column/article/118826 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的? 2.5介绍了渲染流水线中的 DOM 生成、样式计算和布局三个阶段,2.6讲解渲染流水线后面的阶段…...
浏览器WEB播放RTSP
注意:浏览器不能直接播放RTSP,必须转换后才能播放。这一点所有的播放都是如此。 参考 https://github.com/kyriesent/node-rtsp-stream GitHub - phoboslab/jsmpeg: MPEG1 Video Decoder in JavaScript 相关文件方便下载 https://download.csdn.net…...
DeepSeek开源Day4:DualPipeEPLB技术详解
2 月 24 日,DeepSeek 启动 “开源周”,第四个开源的代码库为 DualPipe 与 EPLB(一下发布了两个)。DualPipe 与 EPLB 依然使用了大量与 Hopper 架构绑定的技术。 DualPipe 是由 DeepSeek-AI 团队开发的一种双向流水线并行通信算法&…...
阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1
阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...
vue实现一个pdf在线预览,pdf选择文本并提取复制文字触发弹窗效果
[TOC] 一、文件预览 1、安装依赖包 这里安装了disjs-dist2.16版本,安装过程中报错缺少worker-loader npm i pdfjs-dist2.16.105 worker-loader3.0.8 2、模板部分 <template><div id"pdf-view"><canvas v-for"page in pdfPages&qu…...
Unity自定义渲染管线(Scriptable Render Pipeline)架构设计与实现指南
一、SRP技术体系概述 1. 核心设计理念 全托管渲染控制:通过C#脚本完全掌控渲染流程 模块化架构:将渲染流程拆分为可组合的RenderPass GPU友好设计:支持CommandBuffer与Compute Shader混合编程 对惹,这里有一个游戏开发交流小组…...
时间复杂度分析与递归,以新南UNSW的COMP2521作业题为例
作者:Smooth(连接教育高级讲师) 首发于:UNSW学习知识库(UNSW Study Wiki) 创作时间:2025年3月5日 如何测度算法的时间性能?理论分析Theoretical Analysis 测度算法时…...
RxJS与Redux革命性协同:打造高效、解耦的前端状态管理方案
摘要 本文探讨RxJS与Redux的融合应用,通过真实用户场景揭示其必要性,系统讲解整合策略,从基础到高级涵盖响应式编程优化、异步操作处理、状态流控制等核心主题。提供可落地的架构方案与性能优化技巧,包含10可复用代码示例和20实战…...
蓝桥杯P1259-奇怪的馈赠 (贪心题解)
题目:奇怪的捐赠 题目来源:1.奇怪的捐赠 - 蓝桥云课 题目描述 需要将 100 万(1,000,000)正好分成若干个 7 的次方形式的数(如 7^01, 7^17, 7^249 等),且每种金额(即每个 7 的次方…...
todo: 使用融云imserve做登录(android)
使用融云做登录注册思路 注册界面需要name, email, password考虑到融云注册用户的post格式 POST http://api.rong-api.com/user/getToken.json?userId1690544550qqcom&nameIronman这里的userId可以使用用户的email,但是要截断和 . 符号,即1690544…...
如何设置爬虫的User-Agent?
在爬虫开发中,设置合适的 User-Agent 是非常重要的一步。User-Agent 是 HTTP 请求头中的一个字段,用于标识客户端(通常是浏览器)的类型、版本、操作系统等信息。通过设置 User-Agent,可以模拟正常的浏览器访问行为&…...
C++ 二叉搜索树代码
C 二叉搜索树代码 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL){}TreeNode(T x):val(x), left(NULL), right(NULL){} };template<typena…...
