C语言中常用的字符串处理函数(strlen、strcpy、strcat、strcmp)

news2024/12/24 0:30:31

文章目录

  • 写在前面
  • 1. strlen
    • 1.1 函数介绍
    • 1.2 模拟实现
  • 2. strcpy
    • 2.1 函数介绍
    • 2.2 模拟实现
  • 3. strcat
    • 3.1 函数介绍
    • 3.2 模拟实现
  • 4. strcmp
    • 4.1 函数介绍
    • 4.2 模拟实现

写在前面

本篇文章介绍了C语言中常用的字符串处理函数,包括strlen、strcpy、strcat和strcmp。文章中,对这几个函数进行了详细的解释和示例演示,并进行了模拟实现。

1. strlen

1.1 函数介绍

函数原型:

size_t strlen ( const char * str );
  • str:要计算长度的字符串的指针。

strlen函数是一个用于计算字符串长度的函数,它从指定的字符串起始位置开始,逐个字符地计算,直到遇到字符串结尾的 \0 为止。它返回的是字符串中\0之前的字符个数,不包括\0。
关于strlen需要注意以下几点:

  • 参数指向的字符串必须要以 \0结束,否则strlen求得的结果是未知的。
  • 注意函数的返回值为size_t,是无符号的( 易错)。

以下代码,展示了如何使用 strlen 函数来计算字符串的长度:

#include <stdio.h>
#include <string.h>

int main() {
    const char* str = "Hello World!";
    size_t len = strlen(str);
    
    printf("字符串长度:%d\n", len);
    return 0;
}

1.2 模拟实现

strlen函数的模拟实现(3种方法):

  1. 递归求字符串长度。
#include <stdio.h>
#include <assert.h>

size_t my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
	{
		return 0;
	}
	return 1 + my_strlen(str+1);	
}

int main() {
    const char* str = "Hello World!";
    size_t len = my_strlen(str);
    
    printf("字符串长度:%d\n", len);
    return 0;
}
  1. 计数器方法求字符串长度。
#include <stdio.h>
#include <assert.h>

size_t my_strlen(const char* str)
{
	assert(str);
	size_t count = 0;
	while (*str++)
	{
		count++;
	}
	return count;
}

int main() {
    const char* str = "Hello World!";
    size_t len = my_strlen(str);
    
    printf("字符串长度:%d\n", len);
    return 0;
}
  1. 指针 - 指针求字符串长度。
#include <stdio.h>
#include <assert.h>

size_t my_strlen(const char* str)
{
	assert(str);
	const char* _str = str;
	while (*str)
	{
		str++;
	}
	return str - _str;
}

int main() {
    const char* str = "Hello World!";
    size_t len = my_strlen(str);
    
    printf("字符串长度:%d\n", len);
    return 0;
}

2. strcpy

2.1 函数介绍

函数原型:

char * strcpy ( char * destination, const char * source );
  • destination:目标字符串的指针,即将源字符串的内容复制到这个字符串中。
  • source:源字符串的指针,即要复制的字符串。

strcpy是一个用于完成字符串拷贝的函数,函数将源字符串的内容复制到目标字符串中,直到遇到源字符串的结尾的 \0 为止。复制完成后,函数返回目标字符串的起始地址。
关于strcpy需要注意以下几点:

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变

以下代码,展示了如何使用 strcpy 函数来完成字符串拷贝:

#include <stdio.h>
#include <string.h>

int main()
{
	char dest[20];//目标字符串数组
	const char* src = "hello word!";//源字符串

	//使用strcpy函数,将源字符串拷贝到目标字符串
	strcpy(dest, src);

	printf("目标字符串:%s\n", dest);
	return 0;
}

2.2 模拟实现

strcpy模拟实现:

  • 使用循环遍历 src 字符串中的每个字符。
  • 在循环中,将 src 字符串的每个字符复制到 dest 字符串的对应位置,包括结尾的 \0。
  • 循环直到遇到 src 字符串的 \0,然后结束循环。
  • 返回 dest字符串的起始地址,表示复制完成。
#include <stdio.h>
#include <assert.h>
//模拟实现
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	//保留目标字符串起始地址
	char* _dest = dest;
	//逐个字符进行拷贝
	while (*dest++ = *src++)
	{
		;
	}
	return _dest;
}
int main()
{
	char dest[20];
	const char* src = "hello word!";

	my_strcpy(dest, src);
	printf("目标字符串:%s\n", dest);

	return 0;
}

3. strcat

3.1 函数介绍

函数原型:

char * strcat ( char * destination, const char * source );
  • destination:目标字符串的指针,即要将源字符串追加到这个字符串的末尾。
  • source:源字符串的指针,即要追加到目标字符串末尾的字符串。

strcat是一个用于完成字符串追加的函数,它将源字符串的内容追加到目标字符串的末尾,直到遇到源字符串的 \0 为止。追加完成后,函数返回目标字符串的起始地址,并且目标字符串将包含原始内容以及追加内容,且以结尾\0 结束。
关于strcat需要注意以下几点:

  • 源字符串必须以 ‘\0’ 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

以下代码,展示了如何使用 strcat 函数来追加字符串:

#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello, ";
    const char* src = "World!";  // 源字符串
    
    // 使用 strcat 追加源字符串到目标字符串
    strcat(dest, src);
    
    printf("目标字符串:%s\n", dest);
    
    return 0;
}

3.2 模拟实现

strcat模拟实现:
实现思路:

  • 使用循环找到 dest字符串中 \0 的位置。
  • 使用循环,将 src字符串的每个字符从dest字符串\0的位置依次往后追加(包括src中\0),直到遇到 src 字符串中的 \0。
  • 返回 dest字符串的起始地址,表示追加完成。
#include <stdio.h>
#include <assert.h>
//模拟实现
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* _dest = dest;
	//找末尾\0
	while (*dest)
	{
		dest++;
	}
	//从目标字符串\0位置开始往后追加
	while (*dest++ = *src++)
	{
		;
	}
	return _dest; 
}

int main()
{
	const char* src = "word!";// 源字符串
	char dest[30] = "hello ";
	
	my_strcat(dest, src);

	printf("%s\n", dest);
	return 0;
}

4. strcmp

4.1 函数介绍

函数原型:

int strcmp ( const char * str1, const char * str2 );
  • str1:要比较的第一个字符串的指针。
  • str2:要比较的第二个字符串的指针。

strcmp 是一个字符串比较函数,用于比较两个字符串的内容。该函数返回一个整数值,表示比较的结果。
标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字。
  • 第一个字符串等于第二个字符串,则返回0。
  • 第一个字符串小于第二个字符串,则返回小于0的数字。

关于strcmp需要注意以下几点:

  • strcmp 函数是区分大小写的,因此大写字母和小写字母被认为是不同的字符。
  • 在比较字符串时,要确保字符串以\0 结尾,否则可能会导致未定义行为。

以下代码,展示了如何使用 strcmp 函数来进行字符串比较:

#include <stdio.h>
#include <string.h>

int main() {
    const char *str1 = "abcdef";
    const char *str2 = "abcdeg";
    
    int res = strcmp(str1, str2);
    
    if (res < 0) 
    {
        printf("%s 小于 %s\n", str1, str2);
    } 
    else if (res == 0)
    {
        printf("%s 等于 %s\n", str1, str2);
    } 
    else {
        printf("%s 大于 %s\n", str1, str2);
    }
    
    return 0;
}

4.2 模拟实现

strcmp模拟实现:
实现思路:

  • 使用循环遍历 str1 和 str2 字符串中的每个字符,同时比较它们的对应字符。如果同时遍历到\0的位置循环都没结束,表示两个字符串相等,返回0。
  • 在循环中,如果发现字符不相等,则返回它们的差值(ASCII码值之差)。
#include <stdio.h>
#include <assert.h>
//模拟实现
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	//使用循环遍历 str1 和 str2,同时比较它们的对应字符
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	//发现字符不相等,则返回它们的差值
	return *str1 - *str2;
}

int main() {
	const char *str1 = "abcdeg";
	const char *str2 = "abcdef";

	int res = my_strcmp(str1, str2);

	if (res < 0)
	{
		printf("%s 小于 %s\n", str1, str2);
	}
	else if (res == 0)
	{
		printf("%s 等于 %s\n", str1, str2);
	}
	else {
		printf("%s 大于 %s\n", str1, str2);
	}

	return 0;
}

至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !
在这里插入图片描述

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

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

相关文章

Redis集群方案-主从复制-哨兵模式-分片集群

Redis集群方案 主从复制全量同步增量同步&#xff08;slave重启或者后期数据变化&#xff09; 哨兵模式服务状态监控哨兵选主规则 分片集群哈希槽 主从复制 单节点的Redis的并发能力是有上线的&#xff0c;要进一步提高redis的并发能力&#xff0c;就需要搭建主从集群&#xff…

第一节:vue3 配置路由

1.安装router插件npm install vue-router4或者yarn add vue-router4 2.新建router文件夹以及router里边的index.js&#xff1a;里边主要配置路由 import {createRouter,createWebHashHistory} from vue-router // 1.新的页面导入进来 import Home from ../view/Home.vue impor…

使用华为eNSP组网试验⑹-组建基于BGP的网络

BGP(Border Gateway Protocol -- 边界网关协议)是一种在自治系统之间动态交换路由信息、具有丰富的路由控制机制、稳定而安全的路由协议路由协议&#xff0c;一般部署在骨干(主要、核心)路由器。 BGP适用于大中型网络的组建&#xff0c;在很多企业当中都有应用。 一般情况下&am…

2023年化妆品级珠光材料随化妆品需求增加推动产品需求量[图]

珠光材料是通过特定工艺方法&#xff0c;在天然云母或人工合成等基材表面包覆一层或多层金属氧化物而制得的一种材料。在化妆品领域&#xff0c;珠光颜料常用于口红、眼影、指甲油、粉饼等化妆品的制造&#xff0c;以产品的闪亮度和吸引力&#xff0c;使其更加美观。 化妆品级…

java CPU 或者内存 异常排查

java CPU 或者内存 异常排查 提示&#xff1a;需要基础环境和配置上java-home CPU 或者内存 异常排查 java CPU 或者内存 异常排查前言一、java文件上传&#xff08;Test.java&#xff09;二、转换为class三、执行命令&#xff0c;启动文件四、使用top命令查看五、下载文件&…

【MATLAB源码-第44期】基于matlab的2*2MIMO-LDPC系统的误码率仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 2x2 MIMO&#xff08;多输入多输出&#xff09;和LDPC&#xff08;低密度奇偶校验码&#xff09;编码是在通信系统中常用的技术&#xff0c;它们通常用于提高无线通信系统的性能和可靠性。 1. 2x2 MIMO&#xff1a; 2x2 MIMO…

Micriosoft 365 和 Office 之间的对比

Micriosoft 365 以前也叫做 Office 365&#xff0c;2020 年微软官方将它改名为了 Microsoft 365。

MySQL Cluster 简介

文章目录 1.简介2.组成参考文献 1.简介 MySQL Cluster 是官方推出的基于 NDB&#xff08;Network DataBase&#xff09;存储引擎的高可用和可伸缩的分布式数据库系统。 以下是 MySQL NDB Cluster 的主要特点和能力&#xff1a; 高可用&#xff1a;MySQL Cluster 具有内置的高…

截胡高通,三星Exynos 2400率先登场:旗舰芯片定位。

今年 2 月&#xff0c;三星在全球发布了 GalaxyS23 系列&#xff0c;不同于过去的双处理器策略&#xff0c;Galaxy S23 系列全线搭载了采用台积电4nm 生产的高通骁龙 8 Gen 2&#xff0c;三星自家的 Exynos 2300 则直接轮空——被弃之不用。 但我们在之后的文章中就指出&#x…

物联网AI MicroPython传感器学习 之 WS2812 RGB点阵灯环

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 ws2812是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同&#xff0c;每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路&a…

基于vue框架的uniapp小程序开发发现了新大陆

项目场景&#xff1a; 在基于vue框架的uniapp小程序开发中&#xff0c;在页面跳转时&#xff0c;当前页路径带参数&#xff0c;在跳转页中接受数据除了用官方推荐的保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用onLoad(option)接受数据&#xff0c;但是我发…

【动手学深度学习】课程笔记 04 数据操作和数据预处理

目录 数据操作 N维数组样例 访问元素 数据操作实现 入门 运算符 广播机制 节省内存 转换为其他Python对象 数据预处理实现 数据操作 N维数组是机器学习和神经网路的主要数据结构。 N维数组样例 访问元素 数据操作实现 下面介绍一下本课程中需要用到的PyTorch相关操…

【jvm--堆】

文章目录 1. 堆&#xff08;Heap&#xff09;的核心概述2. 图解对象分配过程2.1 Minor GC&#xff0c;MajorGC、Full GC 1. 堆&#xff08;Heap&#xff09;的核心概述 堆针对一个 JVM 进程来说是唯一的&#xff0c;也就是一个进程只有一个 JVM&#xff0c;但是进程包含多个线程…

Leetcode hot 100之回溯O(N!):选择/DFS

目录 框架&#xff1a;排列/组合/子集 元素无重不可复选 全排列 子集 组合&#xff1a;[1, n] 中的 k 个数 分割成回文串 元素无重不可复选&#xff1a;排序&#xff0c;多条值相同的只遍历第一条 子集/组合 先进行排序&#xff0c;让相同的元素靠在一起&#xff0c;如…

玩重生奇迹MU如何搭配武器装备

在游戏里面怎么搭配装备呢&#xff0c;玩家是否在思考这个问题呢&#xff0c;肯定要不断的了解所玩的职业&#xff0c;必须要懂得掌握不一样的装备搭配方法&#xff0c;这样才可以更好的发挥所玩职业最强大的伤害输出。 一、武器装备搭配技巧 在游戏中需要懂得搭配装备的技巧…

2023年中国互联网本地生活服务行业发展历程及趋势分析:国内市场仍有增长潜力[图]

我国本地生活进入4.0时代&#xff0c;“附近消费”场景迭代、渠道多元&#xff1b;更多玩家涌入本地生活赛道&#xff0c;本地消费场景分散到多平台、多模式&#xff0c;线下门店短视频直播运营组合蔚然成风。 本地生活行业发展历程 资料来源&#xff1a;共研产业咨询&#xf…

阿里云轻量应用服务器月流量限制说明(部分套餐不限流量)

阿里云轻量应用服务器部分套餐限制月流量&#xff0c;轻量应用服务器按照套餐售卖&#xff0c;有的套餐限制月流量&#xff0c;有的不限制流量。像阿里云轻量2核2G3M带宽轻量服务器一年108元和轻量2核4G4M带宽一年297.98元12个月&#xff0c;这两款是不限制月流量的。阿里云百科…

前端TypeScript学习day02-TS常用类型

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 TypeScript 常用类型 接口 元组 类型推论 类型断言 字面量类型 枚举 any 类型 typeof TypeScrip…

yolov5及yolov7实战之剪枝

之前有讲过一次yolov5的剪枝&#xff1a;yolov5实战之模型剪枝_yolov5模型剪枝-CSDN博客 当时基于的是比较老的yolov5版本&#xff0c;剪枝对整个训练代码的改动也比较多。最近发现一个比较好用的剪枝库&#xff0c;可以在不怎么改动原有训练代码的情况下&#xff0c;实现剪枝的…

c#学生管理系统

一、系统概述 学生管理系统是一个旨在帮助学校、教育机构和教育者有效管理学生信息、课程安排和成绩记录的应用程序。该系统旨在简化学生管理的各个方面&#xff0c;提供高效的解决方案&#xff0c;以满足教育机构的需求。 二、功能模块 1. 学生信息管理 添加学生:录入学生…