[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); // 输出:olleH
    return 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); // 输出:Ifmmp
    return 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); // 输出:abcdef
    return 0;
}

总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于websocket的多用户网页五子棋 --- 测试报告

目录 功能测试自动化测试性能测试 功能测试 1.登录注册页面 2.游戏大厅页面 3.游戏房间页面 自动化测试 1.使用脑图编写web自动化测试用例 2.创建自动化项目&#xff0c;根据用例通过selenium来实现脚本 根据脑图进行测试用例的编写&#xff1a; 每个页面一个测试类&am…

【Linux】信号处理以及补充知识

目录 一、信号被处理的时机&#xff1a; 1、理解&#xff1a; 2、内核态与用户态&#xff1a; 1、概念&#xff1a; 2、重谈地址空间&#xff1a; 3、处理时机&#xff1a; 补充知识&#xff1a; 1、sigaction&#xff1a; 2、函数重入&#xff1a; 3、volatile&…

(三) 征服MySQL面试:30+高频核心问题深度剖析与实战指南

一、为什么MySQL是面试的"必答题"&#xff1f; 数据库领域占比&#xff1a;MySQL占据全球关系型数据库市场份额Top 3&#xff0c;阿里、腾讯、美团等大厂核心系统深度依赖技术栈深度检验&#xff1a;通过MySQL问题可考察候选人的数据结构理解、系统设计能力、性能优…

TensorFlow深度学习实战(10)——迁移学习详解

TensorFlow深度学习实战(10)——迁移学习详解 0. 前言1. 迁移学习1.1 迁移学习基本概念1.2 迁移学习的重要性1.3 ImageNet1.4 迁移学习流程2. Inception V3 架构3. 构建迁移学习模型小结系列链接0. 前言 迁移学习( Transfer Learning )是一种利用从一项任务中获得的知识来解…

Docker基础篇——什么是Docker与Docker的仓库、镜像、容器三大概念

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起了解下什么是Docker与与Docker的仓库、镜像、容器三大概念。 …

蓝桥杯题型

蓝桥杯题型分类 二分 123 传送门 1. 小区间的构成 假设数列的构成是如下形式&#xff1a; 第 1 个区间包含 1 个元素&#xff08;1&#xff09;。第 2 个区间包含 2 个元素&#xff08;1 2&#xff09;。第 3 个区间包含 3 个元素&#xff08;1 2 3&#xff09;。第 4 个区…

大模型AI平台DeepSeek 眼中的SQL2API平台:QuickAPI、dbapi 和 Magic API 介绍与对比

目录 1 QuickAPI 介绍 2 dbapi 介绍 3 Magic API 介绍 4 简单对比 5 总结 统一数据服务平台是一种低代码的方式&#xff0c;实现一般是通过SQL能直接生成数据API&#xff0c;同时能对产生的数据API进行全生命周期的管理&#xff0c;典型的SQL2API的实现模式。 以下是针对…

本地部署pangolin获取谱系,从而达到预测新冠的流行趋势

步骤 1&#xff1a;安装Docker 注&#xff1a;此步骤忽略&#xff0c;可通过Docker官网对于文档进行安装,地址如下 Docker: Accelerated Container Application Developmenthttps://www.docker.com/ 步骤 2&#xff1a;拉取Pangolin镜像 docker pull staphb/pangolin:latest 步…

HarmonyOS Next 属性动画和转场动画

HarmonyOS Next 属性动画和转场动画 在鸿蒙应用开发中&#xff0c;动画是提升用户体验的关键要素。通过巧妙运用动画&#xff0c;我们能让应用界面更加生动、交互更加流畅&#xff0c;从而吸引用户的注意力并增强其使用粘性。鸿蒙系统为开发者提供了丰富且强大的动画开发能力&…

K8S学习之基础十:k8s中初始化容器和主容器

init容器和主容器 init容器和主容器的区别 初始化容器不支持 Readinessprobe&#xff0c;因为他们必须在pod就绪之前运行完成每个init容器必须运行成功&#xff0c;下一个才能够运行 # 定义两个初始化容器&#xff0c;完成后再运行主容器 vi pod-init.yaml apiVersion: v1 …

PostgreSQL 安装与使用

下载地址: EDB: Open-Source, Enterprise Postgres Database Management 安装图形化安装界面安装。安装完后将bin目录配置到系统环境变量 执行psql -h localhost -p 5432 -U postgres 密码在安装过程中设置的 ​ 0、修改密码 ALTER USER sonar WITH PASSWORD 123456; 1、新…

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布&#xff1a;确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…

Mybatis 的关联映射(一对一,一对多,多对多)

前言 在前面我们已经了解了&#xff0c;mybatis 的基本用法&#xff0c;动态SQL&#xff0c;学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中&#xff0c;对数据库的操作&#xff0c;常常涉及多张表。 因此本篇博客的目标&#xff1a;通过my…

在Linux中开发OpenGL——检查开发环境对OpenGL ES的支持

由于移动端GPU规模有限&#xff0c;厂商并没有实现完整的OpenGL特性&#xff0c;而是实现了它的子集——OpenGL ES。因此如果需要开发的程序要支持移动端平台&#xff0c;最好使用OpenGL ES开发。 1、 下载支持库、OpenGL ES Demo 1.1、下载PowerVRSDK支持库作为准备&#xff…

【Python项目】基于深度学习的电影评论情感分析系统

【Python项目】基于深度学习的电影评论情感分析系统 技术简介&#xff1a;采用Python技术、Flask框架、MySQL数据库、Word2Vec模型等实现。 系统简介&#xff1a;该系统基于深度学习技术&#xff0c;特别是Word2Vec模型&#xff0c;用于分析电影评论的情感倾向。系统分为前台…

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx&#xff0c;通过源码烧写的系统。 首先打开终端&#xff0c;输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容&#xff0c; ONNX&#xff08;Open Neural Network E…

Arcgis中添加脚本工具箱

文章目录 准备资料1、打开arcmap2、找到目录窗口3、复制粘贴工具箱的路径4、添加或者确认python脚本路径准备资料 (1)工具箱 (2)python脚本 1、打开arcmap 2、找到目录窗口 3、复制粘贴工具箱的路径 4、添加或者确认python脚本路径 脚本上右键属性(注意:脚本内容和路径…

第二次CCF-CSP认证(思路及源码)

第二次CCF-CSP认证 第一道&#xff08;easy&#xff09;思路及AC代码 第二道&#xff08;easy&#xff09;基本思路及AC代码 第三道&#xff08;mid&#xff09;基本思路及AC代码solution 1 (模拟)solution 2&#xff08;KMP&#xff09; 第一道&#xff08;easy&#xff09; 题…

RAGflow 无法加载Embedding模型

部署0.17版本的RAGflow&#xff0c;在模型列表中已经添加了嵌入模型&#xff0c;但是知识库配置时&#xff0c;嵌入模型灰显&#xff1a; 问题原因&#xff1a; 提前上传了一个文档&#xff0c;在知识库有文档之后&#xff0c;就不能够修改嵌入模型了。删除文档之后&#xff0…

C++ Primer 拷贝、赋值与销毁

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…