• 【C语言进阶篇】字符函数和字符串函数——strstr&&strtok&&strerror&&strncpy&&strncat&&strcmp函数


    大家好我是沐曦希💕


    1.前言

    前面学到了求字符串函数strlen和长度不受限制的字符串函数,那么现在学习学习另一些字符串函数。

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

    2.1 strncpy

    char * strncpy ( char * destination, const char * source, size_t num );
    
    • 1

    在这里插入图片描述

    1.Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
    2.拷贝num个字符从源字符串到目标空间。
    3.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

    #include
    #include
    int main()
    {
    	char arr1[10] = "abcdef";
    	char arr2[4] = "ddd";
    	strncpy(arr1, arr2, 3);
    	printf("%s\n", arr1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    调试看一下,为复制之前:
    在这里插入图片描述

    复制后:
    在这里插入图片描述
    arr1的前三个字节改变成arr2的内容,arr2没有变化。
    如果要复制的字节数大于源字符串呢?
    源字符串字节小于复制的字节数:

    #include
    #include
    int main()
    {
    	char arr1[10] = "abcdef";
    	char arr2[4] = "d";
    	strncpy(arr1, arr2, 5);
    	printf("%s\n", arr1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    复制之前:

    在这里插入图片描述
    复制之后:

    在这里插入图片描述
    可以清楚的看到,内容不够时会用’\0’来补充!

    2.1.1 模拟实现strncpy

    #include
    #include
    char* my_strncpy(char* dest, const char* src, size_t n)
    {
    	assert(dest && src);
    	char* ret = dest;
    	while (n--)
    	{
    		*dest++ = *src++;
    	}
    	return ret;
    }
    int main()
    {
    	char arr1[10] = "abcdef";
    	char arr2[6] = "ddddd";
    	my_strncpy(arr1, arr2, 5);
    	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

    在这里插入图片描述

    2.2 strncat

    char * strncat ( char * destination, const char * source, size_t num );
    
    • 1

    在这里插入图片描述

    1.Appends the first num characters of source to destination, plus a terminating null-character.
    2.If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.

    #include
    #include
    int main()
    {
    	char arr1[15] = "zhang\0aaaaa";
    	char arr2[] = "san";
    	strncat(arr1, arr2, 3);
    	printf("%s\n", arr1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    追加之前:
    在这里插入图片描述
    追加之后:
    在这里插入图片描述
    可以清楚看到追加的字符串后面会加‘\0’作为结束标志,并且在目标字符串的’\0’位置开始追加的源字符串的。

    那么如果追加的字节数大于源字符串的字节数呢?

    #include
    #include
    int main()
    {
    	char arr1[15] = "zhang\0aaaaa";
    	char arr2[] = "s";
    	strncat(arr1, arr2, 5);
    	printf("%s\n", arr1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    追加之前:
    追加之前
    追加之后:
    追加之后
    可以清楚看见并没有继续追加’\0’,只会添加一个’\0’。

    2.2.1 模拟实现strncat

    #include
    #include
    char* my_strncat(char* dest, const char* src, size_t n)
    {
    	assert(dest && src);
    	char* ret = dest;
    	while (*dest != '\0')
    		dest++;
    	while (n--)
    	{
    		*dest++ = *src++;
    	}
    	*dest = '\0';
    	return ret;
    }
    int main()
    {
    	char arr1[15] = "zhang\0xxxx";
    	char arr2[4] = "san";
    	my_strncat(arr1, arr2, 3);
    	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

    在这里插入图片描述

    2.3 strncmp

    int strncmp ( const char * str1, const char * str2, size_t num );
    
    • 1

    在这里插入图片描述

    1.比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
    在这里插入图片描述

    #include 
    #include 
    int main()
    {
        char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
        int n;
        puts("Looking for R2 astromech droids...");
        for (n = 0; n < 3; n++)
            if (strncmp(str[n], "R2xx", 2) == 0)
            {
                printf("found %s\n", str[n]);
            }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    strncmp与strcmp一样比较的是字符的ASCII码值。

    2.3.1 模拟实现strncmp

    #include
    #include
    int my_strncmp(const char* str1, const char* str2, size_t n)
    {
    	assert(str1 && str2);
    	while (n--)
    	{
    		if (*str1 != *str2)
    			break;
    		str1++;
    		str2++;
    	}
    	return (*str1 - *str2);
    }
    int main()
    {
    	char arr1[] = "abcdef";
    	char arr2[] = "abq";
    	int ret = my_strncmp(arr1, arr2, 3);
    	printf("%d\n", ret);
    	if (ret > 0)
    		printf("arr1>arr2");
    	else if (ret == 0)
    		printf("arr1==arr2");
    	else
    		printf("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.字符串查找

    3.1.strstr

    const char * strstr ( const char * str1, const char * str2 );
          char * strstr (       char * str1, const char * str2 );
    
    • 1
    • 2

    在这里插入图片描述

    Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.

    #include 
    #include 
    int main()
    {
    	char str[] = "This is a simple string";
    	char* pch = NULL;
    	pch = strstr(str, "simple");
    	puts(pch);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    模拟实现strstr

    查找字符串分两种情况:
    第一种情况是:一次匹配完成。
    在这里插入图片描述

    第二种情况是:要多次匹配才能找到。
    在这里插入图片描述

    #include
    #include
    char* my_strstr(const char* str1, const char* str2)
    {
    	assert(str1 && str2);
    	const char* p = str1;
    	const char* s2 = str2;
    	const char* s1 = str1;
    	while (*p)
    	{
    		s1 = p;
    		s2 = str2;
    		while (*s2 == *s1 && *s1 != '\0' && s2 != '\0')
    		{
    			s2++;
    			s1++;
    		}
    		if (*s2 == '\0')
    			return (char*)p;
    		p++;
    	}
    	return NULL;
    }
    int main()
    {
    	char arr1[] = "bbbcdef";
    	char arr2[] = "bbc";
    	char* ret = my_strstr(arr1, arr2);
    	if (ret == NULL)
    		printf("字符串不存在!\n");
    	else
    		printf("%s\n", ret);
    	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
    • 33
    • 34

    在这里插入图片描述

    3.2.strtok

    char * strtok ( char * str, const char * delimiters );
    
    • 1

    在这里插入图片描述

    1.sep参数是个字符串,定义了用作分隔符的字符集合
    2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
    3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
    4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
    5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
    6.如果字符串中不存在更多的标记,则返回 NULL 指针。

    #include
    #include
    int main()
    {
    	const char* seq = "@.";
    	char email[] = "LiuJin@qq.com";
    	char cp[30] = { 0 };
    	strcpy(cp, email);
    	char* ret = strtok(cp, seq);
    	if (ret != NULL)
    		printf("%s\n", ret);
    	ret = strtok(NULL, seq);
    	if (ret != NULL)
    		printf("%s\n", ret);
    	ret = strtok(NULL, seq);
    	if (ret != NULL)
    		printf("%s\n", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    for循环实现

    #include
    #include
    int main()
    {
    	const char* seq = "@.";
    	char email[] = "LiuJin@qq.com";
    	char cp[30] = { 0 };
    	strcpy(cp, email);
    	char* ret = NULL;
    	for (ret = strtok(cp, seq); ret != NULL; ret = strtok(NULL, seq))
    	{
    		printf("%s\n", ret);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.错误信息报告

    4.1strerror

    char * strerror ( int errnum )
    
    • 1

    在这里插入图片描述
    C语言的库函数在执行失败的时候,都会设置错误码。
    errno是C语言设置的一个全局的错误码存放的变量。

    #include 
    #include 
    #include //必须包含的头文件
    int main()
    {
        FILE* pFile;
        pFile = fopen("unexist.ent", "r");//fopen打开文件
        //r-->read,表示文件以读形式打开
        if (pFile == NULL)
            printf("Error opening file unexist.ent: %s\n", strerror(errno));
        //errno: Last error number
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

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

    在这里插入图片描述

    5.字符操作

    5.1 字符分类函数

    函数如果他的参数符合下列条件就返回真
    iscntrl任何控制字符
    isspace空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
    isdigit十进制数字 0~9
    isxdigit十六进制数字,包括所有十进制数字,小写字母af,大写字母AF
    islower小写字母a~z
    isupper大写字母A~Z
    isalpha字母az或AZ
    isalnum字母或者数字,az,AZ,0~9
    ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
    isgraph任何图形字符
    isprint任何可打印字符,包括图形字符和空白字符

    5.2 字符转换

    int tolower ( int c );
    int toupper ( int c );
    
    • 1
    • 2
    #include 
    #include 
    int main()
    {
        int i = 0;
        char str[] = "Test String.\n";
        char c;
        while (str[i])
        {
            c = str[i];
            if (isupper(c))
                c = tolower(c);
            putchar(c);
            i++;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    6.写在最后

    那么这一次的字符函数和字符串函数的笔记就到这里啦。小沐会持续更新字符函数和字符串函数。

    不去努力争取,那你连失败的资格都没有!

    在这里插入图片描述

  • 相关阅读:
    智能井盖传感器特点是什么?
    rnacos——用rust重新实现的nacos开源配置、注册中心服务
    windows的远程桌面服务RDS存在弱加密证书的漏洞处理
    金融数字化转型这场硬仗,如何才能做到“有底”和“有数”?
    SpringBatch入门
    关于awd赛制的学习路程·awd的理论内容
    20220915使用python3下载ts格式的视频切片文件
    HTML基础
    超越 Transformer开启高效开放语言模型的新篇章
    算法-手写LRU
  • 原文地址:https://blog.csdn.net/m0_68931081/article/details/125676304