• 【C语言】字符串函数



    添加链接描述

    前言

      大家好呀,今天给大家分享一下字符函数和字符串函数
    
    • 1

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

    1、strcat
    2、strncpy
    3、strncat
    4、strncmp
    5、strstr
    6、strtok
    7、strerror
    8、模拟实现strcat
    9、模拟实现strstr

    1.strcat

    功能:可以在一个字符串后面追加字符
    函数声明:char *strcat( char *strDestination, const char *strSource );
    头文件:string.h
    参数解释以及返回值解释:第一个参数接收被追加字符串数组的地址,第二个参数是追加的内容字符串数组,返回的是追加后字符串数组的地址

    在这里插入图片描述

    #define _CRT_SECURE_NO_WARNINGS
    
    #include 
    #include 
    
    int main()
    {
    	char arr1[20] = "abcdef";
    	char arr2[] = "gh";
    	strcat(arr1, arr2);
    	printf("%s", arr1);
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    int main()
    {
    	char arr1[20] = "abcdef";
    	char arr2[] = {'a','b','c'};
    	strcat(arr1, arr2);
    	printf("%s", arr1);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    程序发生崩溃,arr2数组如果没有’\0’的话,他会在后面地址上找到\0,在追加到arr1数组的时候,会越界放不下
    字符串strcat函数不能自己给自己追加

    追加前:
    在这里插入图片描述
    追加后:
    在这里插入图片描述
    追加的时候把源数组中的‘\0’被追加字符所覆盖

    2.strncpy

    功能:拷贝num个字符从源字符串到目标空间
    函数声明:char * strncpy ( char * destination, const char * source, size_t num );
    头文件:string.h
    参数:第一个参数为接收目标空间地址,第二个参数接收是源空间地址,返回参数是目标地址,size_t是无符号整数类型,num是拷贝字符的数目

    #define _CRT_SECURE_NO_WARNINGS
    
    #include 
    #include 
    
    int main()
    {
    	char arr1[40] = "hered ";
    	char arr2[] = "ll";
    	strncpy(arr1,arr2,2);
    	printf("%s",arr1);
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    3.strncat

    功能:追加num个字符从源字符串到目标空间。
    声明:char * strncat ( char * destination, const char * source, size_t num );
    头文件:string.h
    参数:第一个参数为接收目标空间地址,第二个参数接收是源空间地址,返回参数是目标地址,size_t是无符号整数类型,num是追加字符的数目

    #define _CRT_SECURE_NO_WARNINGS
    #include 
    #include 
    int main()
    {
    	char arr1[40] = "hello ";
    	char arr2[13] = "shuxiansheng";
    	strncat(arr1, arr2, 3);
    	printf("%s",arr1);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    strncat可以追加自己

    #define _CRT_SECURE_NO_WARNINGS
    #include 
    #include 
    int main()
    {
    	char arr1[40] = "hello ";
    	char arr2[13] = "shuxiansheng";
    	strncat(arr1, arr1, 5);
    	printf("%s",arr1);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    4.strncmp

    功能:可以比较指定个数的字符串比较
    声明:int strncmp ( const char * str1, const char * str2, size_t num );
    头文件:string.h
    参数:第一个参数接收第一个字符串地址,第二个参数接收第二个字符串地址,第三个参数为比较字符的个数,比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

    #define _CRT_SECURE_NO_WARNINGS
    #include 
    #include 
    int main()
    {
    	char arr1[6] = "hello";
    	char arr2[] = "helld";
    	int ret=strncmp(arr1, arr2, 4);
    	printf("%d", ret);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    比较前四个字符,由于前四个字符相同,返回0,比较五个字符,o的ascll码值大于d的ascll码值返回1;

    5.strstr

    功能:查找子串
    声明: char * strstr ( char * str1, const char * str2 );
    头文件string.h
    参数:第一个参数接收被查找的字符串的首地址,第二个参数疑似子串的字符串的首地址
    如果是子串的话,返回字符串中子串的首地址,不是子串的话返回空指针

    int main()
    {
    	char arr1[] = "abcdefg";
    	char arr2[] = "fg";
    	char *p=strstr(arr1,arr2);//保存返回子串的首地址
    	if (p)
    	{
    		printf("是子串:%s", p);
    	}
    	else
    	{
    		printf("不是子串");
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    在这里插入图片描述

    6.strtok

    功能:分隔子串
    声明:char * strtok ( char * str, const char * sep );
    头文件:string.h
    参数:第一个参数接收被分解字符串的地址,第二个参数中接收的是字符串中分隔符的地址,返回被分隔子串的首地址

    #define _CRT_SECURE_NO_WARNINGS
    #include 
    #include 
    int main()
    {
    	char arr1[20] = "hello@qq.com";
    	char arr2[] = "@.";
       strtok(arr1, arr2);
       printf("%s", arr1);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    第一个参数指定一个字符串,它包含了0个或者多个由arr2字符串中一个或者多个分隔符分割的标记。
    strtok函数找到arr1中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
    strtok函数的第一个参数不为 NULL ,函数将找到arr1中第一个标记,strtok函数将保存它在字符串中的位置(strtok函数在内部维护了一个静态变量保存这个位置)。
    strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
    如果字符串中不存在更多的标记,则返回 NULL 指针

    #define _CRT_SECURE_NO_WARNINGS
    #include 
    #include 
    int main()
    {
    	char arr1[20] = "hello@qq.com";
    	char arr2[] = "@.";
    	printf("%s\n", strtok(arr1, arr2));
    
       printf("%s\n", strtok(NULL, arr2));
    
    	printf("%s\n", strtok(NULL, arr2));
       
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    **修改:**我们可以将字符串arr1传给strtok函数,第一个@分隔符。strtok函数返回字符串中第一个遇到分隔符之前的字符串首地址,”hello’',然后在循环中继续调用strtok函数,第一个参数传NULL,strtok自己维护的静态变量,记住上次分隔的地方,不用在传arr1.

    #define _CRT_SECURE_NO_WARNINGS
    #include 
    #include 
    int main()
    {
    	char arr1[20] = "hello@qq.com";
    	char arr2[] = "@.";
    	char* p =NULL;
    	for (p = strtok(arr1, arr2); p != NULL; p = strtok(NULL, arr2))
    	{
    		printf("%s\n",p);
    	}
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    7.strerror

    功能:可以返回指向错误信息字符串地址
    声明:char *strerror( int errnum );
    头文件:string.h errno.h
    参数:errnum是错误码,就像404页面,每个错误码对应着错误信息,返回值是指向错误信息字符串地址

    int main()
    {
    	printf("%s\n", strerror(0));
    	printf("%s\n", strerror(1));
    	printf("%s\n", strerror(2));
    	printf("%s\n", strerror(3));
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    当我们向内存申请空间时,我们会使用malloc函数,如果申请的内存太大,是否会报错呢??它会将错误码放在整型全局变量errno中,使用errno时引用头文件errno.h

    `#define _CRT_SECURE_NO_WARNINGS
    
    #include 
    #include 
    #include 
    int main()
    {
    	  int *p=malloc(4000000000);//malloc申请内存失败会返回空地址
    	  if (p == NULL)
    	  {
    		  printf("%s\n", strerror(errno));
    	  }
    
    }`
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    注意:遇到多个错误时,errno会不断赋新的错误码

    8.strcat的模拟实现

    #define _CRT_SECURE_NO_WARNINGS
    #include 
    #include 
    #include 
    char* mystrcat(char* p, char* q)
    {
    	assert(p && q);
    	char* k = &p;//随着p++,会丢失目标字符串首地址先保存
    	while (*p)
    	{
    		p++;
    	}//将p指针移动到目标字符串'\0'位置
    	while ((*p++=*q++))//将*q的值先给*p,然后两个q++;p++;赋值后的ascll值不为0,继续循环,当*q=='\0',赋值后ascll码值为'\0',退出循环
    	{
    	}
    	return k;//返回目标字符串首地址
    }
    int main()
    {
    	char arr1[20] = "abcde";
    	char arr2[5] = "qqq";
    	mystrcat(arr1, arr2);
    	printf("%s", arr1);
    
    }
    
    
    
    • 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

    在这里插入图片描述

    9.strstr的模拟实现

    char* mystrstr(char* str1, char* str2)
    {
    	char* s1 = str1;//两个遍历指针分别指向两个字符串的首地址
    	char* s2 = str2;
    	char* cur = s1;//两个字符串开始匹配的指针
    	while (*cur)//每循环一次,就是重新匹配的过程
    	{
    		s1 = cur;//s1移动到下一个开始匹配的位置
    		s2 = str2;//子串要从头开始匹配
    		while (*s1&&*s2&&(*s1 == *s2))//匹配的循环
    		{
    			s1++;
    			s2++;
            }
    		                            //不匹配退出循环
    		if (*s2 == '\0')//当匹配循环完,s2的指针指向子串的末尾'\0';
    		{
    			return cur;//保存的是匹配成功时,字符串中匹配到的第一个字符首地址
    		}
    		cur++;                       //此时cur指向的位置不能作为开始匹配的位置,cur++;开始新一轮的匹配
    
        }
    	return NULL;//当cur遍历完字符串,则说明没有该子串
    }
    int main()
    {
    	char arr1[] = "abcdecdfg";
    	char arr2[] = "cdf";
    	char *p=mystrstr(arr1,arr2);//如果找到子串返回字符串中和子串匹配的首字符首地址不为空
    	if (p)
    	{
    		printf("是子串");
    	}
    	else
    	{
    		printf("不是子串");
    	}
    
    }
    
    
    • 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
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述
    在这里插入图片描述

    总结

    今天的内容就分享到这里了!!!
    还有未讲到的内存操作函数放在后续讲,如果你觉得这篇文章对你有帮助的话,可以给小樊点赞,哪里有问题的话还请大佬们指教,谢谢大家!!

  • 相关阅读:
    libcoap3对接华为云平台
    ​Cloneable接口
    机器学习 实战系列 总目录
    数据可视化:数据可视化的意义
    buuctf(探险3)
    基于模态凝聚算法的特征系统实现算法的自然激励技术(Matlab代码实现)
    Spring【Spring事务(事务简介、Spring事务管理方案 、Spring事务管理器、控制的API、相关配置 )】(七)-全面详解(学习总结---从入门到深化)
    Excel If函数
    死锁的成因和对应的解决方案
    Node.js 前后端分离开发新思路
  • 原文地址:https://blog.csdn.net/m0_71214261/article/details/132829977