• 字符函数和字符串函数(C语言进阶)


    前言
    C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。
    字符串常量适用于那些对它不做修改的字符串函数

    一.求字符串长度

    1.strlen

    size_t strlen ( const char * str );
    
    • 1

    在这里插入图片描述

    代码演示:
    #include 
    
    int main()
    {
    	const char* str = "abcdef";
        //"abcdef"==str
    	size_t len1 = strlen("abcdef");
    	size_t len2 = strlen(str);
    
    	printf("%d\n", len1);
    	printf("%d\n", len2);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行结果:
    在这里插入图片描述

    1.字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
    在这里插入图片描述

    2.参数指向的字符串必须要以 ‘\0’ 结束。
    数组中不含‘\0’,所以计算strlen为随机值
    在这里插入图片描述

    3.注意函数的返回值为size_t,是无符号的( 易错 )
    让我们来证明下strlen的类型为size_t(无符号整型),看以下代码:

    int main()
    {
    	//两个无符号数相减得到的还是无符号数
    	// 3 - 6 = -3
    	// -3
    	//10000000000000000000000000000011 原码
    	//11111111111111111111111111111100 反码
    	//11111111111111111111111111111101 补码
    	
    	if (strlen("abc") - strlen("abcdef") > 0)
    		printf(">=\n");
    	else
    		printf("<\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    让我们看看运行结果:
    在这里插入图片描述

    对运行结果进行分析
    在这里插入图片描述

    若想比较两个strlen算出的实际大小,将strlen强转成int类型如下

    代码演示:
    #include
    #include 
    int main()
    {
    	if ((int)strlen("abc") - (int)strlen("abcdef") > 0)
    		printf(">=\n");
    	else
    		printf("<\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    在这里插入图片描述

    模拟实现strlen

    1. 计数器
    #include
    int my_strlen(const char* str)
    {
    	int count = 0;
    	while (*str != '\0')
    	{
    		str++;
    		count++;
    	}
    	return count;
    }
    int main()
    {
    	int ret = 0;
    	char arr[] = "abcdef";
    	ret = my_strlen(arr);
    	printf("%d\n", ret);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    运行结果:
    在这里插入图片描述

    2. 指针-指针
    #include
    int my_strlen(const char* str)
    {
    	const char* p = str;
    	while (*str != '\0')
    	{
    		str++;
    	}
    	return str - p;
    }
    int main()
    {
    	int ret = 0;
    	char arr[] = "abcdef";
    	ret = my_strlen(arr);
    	printf("%d\n", ret);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行结果:
    在这里插入图片描述

    3. 递归
    #include
    int my_strlen(const char* str)
    {
    	if (*str == '\0')
    		return 0;
    	else
    		return 1 + my_strlen(str + 1);
    }
    int main()
    {
    	int ret = 0;
    	char arr[] = "abcdef";
    	ret = my_strlen(arr);
    	printf("%d\n", ret);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    运行结果:
    在这里插入图片描述

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

    1.strcpy

    char* strcpy(char * destination, const char * source );
    
    • 1

    在这里插入图片描述

    代码案例:
    #include
    #include
    int main()
    {
    	char arr1[20] = { 0 };
    	char arr2[] = "Hello";
    	strcpy(arr1, arr2);
    	printf("%s\n", arr1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    在这里插入图片描述

    1.源字符串必须以 ‘\0’ 结束。
    对比以下两张图:
    没有‘\0’:

    有‘\0’:
    在这里插入图片描述

    2.会将源字符串中的 ‘\0’ 拷贝到目标空间。
    在这里插入图片描述

    3.目标空间必须足够大,以确保能存放源字符串。
    在这里插入图片描述

    4.目标空间必须可变。
    在这里插入图片描述

    模拟实现strcpy

    #include
    #include
    char* my_strcpy(char* dest, const char* src)
    {
    	
    	char* ret = dest;
    	assert(dest && src);
    	while (*dest++ = *src++)
    	{
    		;
    	}
    	return ret;
    }
    int main()
    {
    	char arr1[20] = { 0 };
    	char arr2[] = "abcd";
    	printf("%s\n", my_strcpy(arr1,arr2));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行结果:
    在这里插入图片描述

    2.strcat

    char * strcat ( char * destination, const char * source );
    
    • 1

    在这里插入图片描述

    代码演示:
    int main()
    {
    	char arr1[20] = "abc";
    	char arr2[] = "def";
    	strcat(arr1, arr2);
    	printf("%s\n", arr1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    运行结果:
    在这里插入图片描述
    1.源字符串必须以 ‘\0’ 结束。(保证能找到目标空间末尾)
    在这里插入图片描述
    在这里插入图片描述
    2.原字符串也必须有‘\0’,再拷贝时将原字符串‘\0’拷贝过去
    在这里插入图片描述

    3.目标空间必须有足够的大,能容纳下源字符串的内容,目标空间必须可修改。
    在这里插入图片描述

    4.字符串自己给自己追加,如何?

    代码结果:
    int main()
    {
    	char arr1[20] = "abc";
    	strcat(arr1, arr1);
    	printf("%s\n", arr1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行结果:
    在这里插入图片描述

    模拟实现strcpy

    代码案例:
    #include
    #include
    #include
    char* my_strcat(char* dest, const char* src)
    {
    	char* ret = dest;
    	assert(dest && src);
    	//1. 找到目标空间的末尾
    	while (*dest != '\0')
    	{
    		dest++;
    	}
    	//2. 数据追加
    	while (*dest++ = *src++)
    	{
    		;
    	}
    	return ret;
    }
    int main()
    {
    	char arr1[20] = "abc";
    	char arr2[] = "def";
    	my_strcat(arr1, arr2);
    	printf("%s\n", arr1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    运行结果:
    在这里插入图片描述
    注:这种模拟实现不可以完成自身追加
    在这里插入图片描述
    为什么不能实现自身追加呢?
    在这里插入图片描述

    3.strcmp

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

    在这里插入图片描述

    标准规定:

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

    模拟实现:

    //代码演示:
    #include
    #include
    #include
    int my_strcmp(const char* str1, const char* str2)
    {
    	assert(str1 && str2);
    	while (*str1 == *str2)
    	{
    		if (*str1 == '\0')
    			return 0;
    		str1++;
    		str2++;
    	}
    	return *str1 - *str2;
    }
    
    int main()
    {
    	char arr1[] = "abq";
    	char arr2[] = "abc";
    	if (my_strcmp(arr1, arr2) > 0)
    	{
    		printf(">\n");
    	}
    	else
    	{
    		printf("<=\n");
    	}
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    运行结果:
    在这里插入图片描述
    💘不知不觉,字符函数和字符串函数1(C语言进阶)以告一段落。通读全文的你肯定收获满满,不久的将来会继续更新字符函数和字符串函数,让我们继续为C语言学习共同奋进!!!

  • 相关阅读:
    Java基础深化和提高 ---- 反射技术
    基于OFDM的水下图像传输通信系统matlab仿真
    MyBatis-plus使用
    【漏洞预警】Linux Kernel权限提升漏洞
    js图像对比可用的一些资源
    VS2015编译Qt工程发生MSB4018错误完整解决过程
    全面分享‘’找不到msvcp140.dll无法继续执行代码修复教程
    关于图片加载,你需要学习一下
    如何让代码为微服务做好准备
    效率倍升:逐浪HMS主题大师1.2-全渠道自动打包、快速传送、锁屏提取、资源审计,移动主题设计辅助利器(全面支持华V米O)
  • 原文地址:https://blog.csdn.net/2201_75642960/article/details/132925061