c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现)

news2024/12/29 9:18:40

前段时间也是把指针较为详细系统的讲解完毕,接下来介绍一个全新的知识点,就是字符函数和字符串函数

前几期文章可进我主页观看:总之就是非常唔姆_Matlab,经验分享,c语言题目分享-CSDN博客

想要源代码可以去我的github看看:Nerosts/just-a-try: 学习c语言的过程、真 (github.com) 


目录

 一.求字符串长度

1.strlen() 

1.1示例 

1.2注意事项 

1.3模拟实现:

 二.长度不受限制的字符串函数

1.strcpy()

1.1示例 

1.2注意事项 

1.3模拟实现

2.strcat()

2.1示例 

 2.2注意事项

 2.3模拟实现

3.strcmp()

3.1示例

 3.2注意事项

3.3模拟实现

 三.长度受限制的字符串函数介绍

1.strncpy()

 1.1示例

1.2注意事项

2.strncat()

 2.1示例

2.2注意事项

 3.strncmp()

3.1示例

 3.2注意事项


 一.求字符串长度

1.strlen() 

当我们需要确定一个字符串的长度时,可以使用字符串函数 strlen()

strlen() 函数的原型如下:

#include <string.h>

size_t strlen(const char *str);

这个函数接受一个指向字符串的指针作为参数,并返回一个 size_t 类型的值,表示字符串中字符的数量

strlen() 函数的工作原理很简单。它会从给定的字符串的第一个字符开始,逐个检查每个字符,直到遇到字符串的结尾标志 \0。在这个过程中,它会计算字符的数量,并最终返回该数量。

1.1示例 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "hello";
	printf("%s的长度是%d", arr, strlen(arr));
	return 0;
}

结果便是: 

1.2注意事项 

但是我们知道最后是有\0的

 所以我们可以得知:strlen() 函数只计算字符串中字符的数量,并不包括结尾的空符 \0

1.3模拟实现:

三种方式:

        1.计数器的方式

        2.递归的方式

        3.指针-指针的方式

计数器的方式:

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

int main()
{
	char arr[] = "hello";
	printf("%s的长度是%d", arr, my_strlen(arr));
	return 0;
}

 递归的方式:

size_t my_strlen(char* pa)
{
	if (*pa)
	{
		return my_strlen(pa + 1) + 1;
	}
	else
	{
		return 0;
	}
}

int main()
{
	char arr[] = "hello";
	printf("%s的长度是%d", arr, my_strlen(arr));
	return 0;
}

指针-指针的方式:

size_t my_strlen(char* pa)
{
	char* start = pa;
	while (*pa)
	{
		pa++;
	}
	return pa - start;
}


int main()
{
	char arr[] = "hello";
	printf("%s的长度是%d", arr, my_strlen(arr));
	return 0;
}


 二.长度不受限制的字符串函数

1.strcpy()

strcpy() 函数用于将源字符串复制到目标字符串中

strcpy() 函数的原型如下:

#include <string.h>

char *strcpy(char *dest, const char *src);

这个函数接受两个参数:dest 和 srcdest 是目标字符串,src 是源字符串。函数会将源字符串中的内容复制到目标字符串中,并返回指向目标字符串的指针。

strcpy() 函数的工作原理很简单。它会从源字符串的第一个字符开始,逐个复制每个字符,直到遇到字符串的结尾标志 \0。在这个过程中,它会将每个字符复制到目标字符串的相应位置。

1.1示例 

int main() 
{
    char src[] = "Hello, world!";
    char dest[20];
    strcpy(dest, src);
    printf("The copied string is: %s\n", dest);
    return 0;
}

结果如下: 

1.2注意事项 

 strcpy() 函数会复制整个源字符串,包括结尾的空字符 \0。所以,在使用 strcpy() 函数时,目标字符串的长度应该足够长,以便能够容纳源字符串的所有字符

\0也在里面

1.3模拟实现

char* my_strcpy(char* dest, char* src)
{
    while (*src)
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = *src;
}

int main() 
{
    char src[] = "Hello, world!";
    char dest[20];
    my_strcpy(dest, src);
    printf("The copied string is: %s\n", dest);
    return 0;
}

结果如下: 

依然可以进一步优化:

char* my_strcpy(char* dest, char* src)
{
    char* ret = dest;
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}


int main() 
{
    char src[] = "Hello, world!";
    char dest[20];
    my_strcpy(dest, src);
    printf("The copied string is: %s\n", dest);
    return 0;
}

2.strcat()

strcat() 函数用于将源字符串追加到目标字符串的末尾

strcat() 函数的原型如下:

#include <string.h>

char *strcat(char *dest, const char *src);

这个函数接受两个参数:dest 和 srcdest 是目标字符串,src 是源字符串。函数会将源字符串中的内容追加到目标字符串的末尾,并返回指向目标字符串的指针。

strcat() 函数的工作原理很简单。它会从目标字符串的结尾开始,逐个复制源字符串的字符,直到遇到源字符串的结尾标志 \0。在这个过程中,它会将每个字符追加到目标字符串的末尾

2.1示例 

int main()
{
	char arr1[20] = "hello";
	char arr2[] = " world";
	printf("%s", strcat(arr1, arr2));
	return 0;
}

 

 2.2注意事项

目标字符串必须具有足够的空间来存储源字符串的内容,否则会导致缓冲区溢出错误,目标字符串的长度应该足够长,以便能够容纳添加后的所有字符

 2.3模拟实现

char* my_strcat(char* dest, char* src)
{
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*src)
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
	return ret;
}

int main()
{
	char arr1[20] = "hello";
	char arr2[] = " world";
	printf("%s", my_strcat(arr1, arr2));
	return 0;
}

3.strcmp()

strcmp() 函数用于比较两个字符串的大小关系

strcmp() 函数的原型如下:

#include <string.h>

int strcmp(const char *str1, const char *str2);

这个函数接受两个参数:str1 和 str2,它们分别是要比较的两个字符串。函数会比较这两个字符串的内容,并返回一个整数值来表示它们的大小关系。

strcmp() 函数的返回值有以下三种可能:

  • 如果 str1 等于 str2,则返回值为 0。
  • 如果 str1 小于 str2,则返回值为一个负整数(通常是 -1)。
  • 如果 str1 大于 str2,则返回值为一个正整数(通常是 1)。

strcmp() 函数的比较是按照字典顺序进行的,即按照字符的 ASCII 值进行比较。它会逐个比较两个字符串中相应位置的字符,直到遇到不相等的字符或者遇到字符串的结尾标志 \0。在比较过程中,如果发现两个字符不相等,就会根据它们的 ASCII 值来确定它们的大小关系。

3.1示例

int main()
{
	char arr1[] = "abc";
	char arr2[] = "aec";
    int result = strcmp(arr1, arr2);

    if (result < 0) {
        printf("arr1 is less than arr2\n");
    }
    else if (result > 0) {
        printf("arr1 is bigger than arr2\n");
    }
    else {
        printf("arr1 is equal to arr2\n");
    }
	return 0;
}

结果如下:

 3.2注意事项

strcmp() 函数比较的是字符串的内容,而不是字符串的长度。所以,在使用 strcmp() 函数时,需要确保两个字符串的内存地址是有效的,并且包含了正确的字符串内容

3.3模拟实现

int my_strcmp(char* arr1, char* arr2)
{
    while (*arr1 == *arr2)
    {
        if (*arr1 == '\0' && *arr2 == '\0')
        {
            return 0;
        }
        arr1++;
        arr2++;
    }
    return *arr1 - *arr2;
}

int main()
{
	char arr1[] = "abc";
	char arr2[] = "aec";
    int result = my_strcmp(arr1, arr2);

    if (result < 0) {
        printf("arr1 is less than arr2\n");
    }
    else if (result > 0) {
        printf("arr1 is bigger than arr2\n");
    }
    else {
        printf("arr1 is equal to arr2\n");
    }
	return 0;
}

结果如下:


 三.长度受限制的字符串函数介绍

1.strncpy()

strncpy() 函数是C语言中的一个字符串函数,用于将一个字符串的一部分复制到另一个字符串中

strncpy() 函数的原型如下:

#include <string.h>

char *strncpy(char *dest, const char *src, size_t n);

这个函数接受三个参数:destsrc 和 ndest 是目标字符串,src 是源字符串,n 是要复制的字符数。

strncpy() 函数会将源字符串中的前 n 个字符复制到目标字符串中,不包括结尾的空字符 \0。如果源字符串的长度小于 n,则会将剩余的字符用空字符 \0 填充。

 1.1示例

int main() 
{
    char src[] = "Hello, World!";
    char dest[20];

    strncpy(dest, src, 5);
    dest[5] = '\0';

    printf("Copied string: %s\n", dest);

    return 0;
}

结果如下: 

1.2注意事项

需要注意的是,strncpy() 函数不会自动在目标字符串的末尾添加空字符 \0

所以,在使用 strncpy() 函数复制字符串后,需要手动在目标字符串的末尾添加空字符 

2.strncat()

strncat() 函数是C语言中的一个字符串函数,用于将一个字符串的一部分连接到另一个字符串的末尾

strncat() 函数的原型如下:

#include <string.h>

char *strncat(char *dest, const char *src, size_t n);

这个函数接受三个参数:destsrc 和 ndest 是目标字符串,src 是源字符串,n 是要连接的字符数。

strncat() 函数会将源字符串中的前 n 个字符连接到目标字符串的末尾,并返回指向目标字符串的指针。如果源字符串的长度小于 n,则会将整个源字符串连接到目标字符串的末尾

 2.1示例

#include<stdio.h>
#include<string.h>
int main() 
{
    char dest[20] = "Hello, ";
    char src[] = "World!";
    strncat(dest, src, 5);
    printf("Connected string: %s\n", dest);
    return 0;
}

结果如下:

2.2注意事项

strncat() 函数会根据目标字符串的长度和要连接的字符数来确定是否有足够的空间来存储连接后的字符串。在使用 strncat() 函数连接字符串时,需要确保目标字符串具有足够的空间来存储连接后的结果 

 3.strncmp()

strncmp() 函数是C语言中的一个字符串函数,用于比较两个字符串的前 n 个字符是否相等

strncmp() 函数的原型如下:

#include <string.h>

int strncmp(const char *str1, const char *str2, size_t n);

这个函数接受三个参数:str1str2 和 nstr1 和 str2 是要比较的两个字符串,n 是要比较的字符数。

strncmp() 函数会比较 str1 和 str2 的前 n 个字符。如果这些字符完全相等,则返回值为0。如果两个字符串在前 n 个字符中有差异,则返回值为一个正整数或负整数,表示第一个不同字符的 ASCII 码差值

3.1示例

int main() {
    char str1[] = "Hello";
    char str2[] = "Hell";

    int result = strncmp(str1, str2, 4);

    if (result == 0) 
    {
        printf("The first 4 characters of str1 and str2 are equal.\n");
    }
    else if (result < 0) 
    {
        printf("The first different character in str1 is smaller than the corresponding character in str2.\n");
    }
    else 
    {
        printf("The first different character in str1 is bigger than the corresponding character in str2.\n");
    }

    return 0;
}

 3.2注意事项

strncmp() 函数会在比较过程中遇到以下情况时停止比较:

  • 两个字符串的前 n 个字符完全相等
  • 已经比较了 n 个字符

如果两个字符串的长度不足 n,则会比较字符串的实际长度。因此,在使用 strncmp() 函数比较字符串时,需要确保字符串的长度足够,并且注意比较的字符数是否正确


今天的内容就梳理到这里了,接下来我会继续进行梳理的。感谢大家支持!!! 


 


 

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

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

相关文章

教你拥有一个自己的QQ机器人!0基础超详细保姆级教学!基于NoneBot2 Windows端搭建QQ机器人

0.序言 原文链接&#xff1a;教你本地化部署一个QQ机器人本教程主要面向Windows系统用户教程从0开始全程详细指导&#xff0c;0基础萌新请放心食用&#x1f355;如果你遇到了问题&#xff0c;请仔细检查是否哪一步有遗漏。如果你确定自己的操作没问题&#xff0c;可以到原文链…

苹果macbook电脑磁盘满了怎么清理内存

如果你是苹果macbook用户&#xff0c;可能会面临一个常见但又令人头疼的问题——磁盘空间不足。这不仅影响了你的电脑性能&#xff0c;还可能导致新的软件无法安装&#xff0c;甚至影响到文件的保存。好消息是&#xff0c;有多种方法可以有效地解决这个问题。下面就一起来看看吧…

【100个 Unity实用技能】☀️ | UGUI Text中加入超链接文本,可直接点击跳转

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

unity脚本_Input鼠标键盘 c#

获取鼠标坐标 检测鼠标输入 如果在运行游戏场景中点击一下鼠标左键 检测鼠标抬起 选中即可 检测键盘按下 当前屏幕分辨率 注意&#xff1a;获取的是显示器的分辨率 获取设备屏幕宽高 屏幕休眠模式 窗口/全屏模式 移动设备屏幕转向

【C语言】字符函数和字符串函数(1)

#国庆发生的那些事儿# 大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解字符函数和字符串函数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1.本章重点2. strlen2.1函数介绍2.2 模拟实现 3. strcpy3…

第八章 排序 六、简单选择排序

目录 一、算法思想 二、例子 1、我们有以下序列要排序 2、首先从左往右扫描&#xff0c;在其中找到最小的一个数&#xff0c;让它与第一个数互换位置 3、此次扫描完成后&#xff0c;我们取新的子序列&#xff0c;并再次从左往右扫描&#xff0c;在其中找到最小的一个数&…

makeMakefile

一、 什么是make&Makefile &#xff1f; ①make 是一条命令,makefile是一个文件,配合使用,通过依赖关系和依赖方法达到我们形成可执行程序的目的 ②makefile好处就是可以进行 自动化编译 ” &#xff0c;极大的提高软件开发的效率,一旦写好&#xff0c;只需要一个 make 命令…

推荐一款在线的JDK17中文文档

spring6.0及springboot3.0最低版本要求都是java17&#xff0c;换上java17是迟早的事&#xff0c;所以虽然我现在做的是java8&#xff0c;但是后面我想从java8直接飞升到java17&#xff0c;先做个准备&#xff0c;找到一个JDK17的中文文档&#xff0c;是在线的&#xff0c;地址&…

数据结构刷题训练——二叉树篇(一)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

学习记忆——方法篇——整除特点

理解记忆法 对于数的整除特征大家都比较熟悉&#xff1a;比如4看后两位&#xff08;因为100是4的倍数&#xff09;&#xff0c;8看后三位&#xff08;因为1000是8的倍数&#xff09;&#xff0c;5末尾是0或5&#xff0c;3与9看各位数字和等等&#xff0c;今天重点研究一下3,9,…

创新家庭办公室:打造完美工作空间的秘诀

一个精心策划的家庭办公室有很多好处&#xff0c;何不把临时工作区升级改造为你的专属工作区呢&#xff0c;还能为这些至关重要的区域注入新的活力。 创造多用途的起居室&#xff1a;我们大多数人都不曾拥有一个可以完全根据工作需求设计的独立家庭办公室——所以有时候要找到…

目标检测算法改进系列之Backbone替换为RIFormer

RIFormer简介 Token Mixer是ViT骨干非常重要的组成成分&#xff0c;它用于对不同空域位置信息进行自适应聚合&#xff0c;但常规的自注意力往往存在高计算复杂度与高延迟问题。而直接移除Token Mixer又会导致不完备的结构先验&#xff0c;进而导致严重的性能下降。 原文地址&…

Pytorch之shuffleNet图像分类

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 前言 ShuffleNet是Face&#xff08;旷视&#xff09;在2017年发布的一个高效率…

【傅里叶梅林图像配准】用于图像配准的傅里叶梅林相位相关性的实现(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python之元组

Python之元组 元组tuple 一个有序的元素组成的集合使用小括号 ( ) 表示元组是不可变对象 tuple(), (), type(()) # 空元组 ((), (), tuple)(1,), (1) # 元组中只有1必须加逗号&#xff0c;否则就是1了 # ((1,), 1)x 1, 2 # 以逗号分隔的内容会形成元组&#xff0c;封装元组x…

壁炉装饰:突破传统的创新趋势

壁炉&#xff0c;一直以来都是家庭温馨的象征&#xff0c;但它也是家居装饰中一个充满潜力的元素。如今&#xff0c;随着设计趋势的不断演变&#xff0c;壁炉装饰已经迈入了一个全新的时代&#xff0c;融合了美学、功能和可持续性&#xff0c;为家庭创造了更多可能性。 壁炉装饰…

强化学习环境 - robogym - 学习 - 3

强化学习环境 - robogym - 学习 - 3 文章目录 强化学习环境 - robogym - 学习 - 3项目地址为什么选择 robogymObservation - 观测信息Action - 动作信息Initialization - 初始状态设置 项目地址 https://github.com/openai/robogym 为什么选择 robogym 自己的项目需要做一些机…

04.数据解析之css选择器

1、常见数据类型 结构化的数据是指可以使用关系型数据库表示和存储&#xff0c;表现为二维形式的数据。一般特点是&#xff1a;数据以行为单位&#xff0c;一行数据表示一个实体的信息&#xff0c;每一行数据的属性是相同的。 1、1 结构化数据 ​ 结构化的数据是指可以使用关…

策略模式与模板方法结合案例

一、背景 上周在迁移项目MQ工程的时候&#xff0c;重新Review代码&#xff0c;发现有一段代码综合使用了策略模式和模板方法&#xff0c;下面讲解一下具体场景应用的思路。 二、模板方法 策略模式前段时间有一个关于库存具体案例&#xff0c;详见 库存管理与策略模式。 模板…

智能银行卡明细筛选与统计,轻松掌握账户总花销!

作为现代生活的重要组成部分&#xff0c;银行卡成为了我们日常消费和收入的主要途径。但是&#xff0c;当我们需要了解自己的银行卡账户的总花销时&#xff0c;繁琐的明细筛选和统计工作常常让人头疼。现在&#xff0c;让我们向您推荐一款智能银行卡明细筛选与统计工具&#xf…