C语言字符函数与字符串函数详解

编辑: admin 分类: c#语言 发布时间: 2021-12-12 来源:互联网
目录
  • 本章重点
  • 前言
  • 1.strlen函数
    • 注意点1
    • 注意点2
  • 2.strcpy
    • 注意点1:
    • 注意点2:
    • 注意点3:
    • 注意点4:
  • 总结

    本章重点

    重点介绍处理字符和字符串的库函数的使用和注意事项

    1.求字符串长度 strlen

    2.长度不受限制的字符串函数 strcpy ,strcat, strcmp

    3.长度受限制的字符串函数 strncpy,strncat ,strncmp

    4.字符串查找 strstr,strtok

    5.错误信息报告 strerror

    6.字符操作

    7.内存操作函数 memcpy,memmove,memset ,memcmp

    前言

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

    1.strlen函数

    size_t strlen ( const char * str );

    • 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
    • 参数指向的字符串必须要以 '\0' 结束。
    • 注意函数的返回值为size_t,是无符号的( 易错 )
    • 学会strlen函数的模拟实现 (计数器、指针-指针、递归)

    讲解:

    注意点1

    有的编译器可能用int来接收strlen函数的返回值会报错,因为strlen函数返回值是size_t( unsigned int 无符号整型 )

    	char arr[] = "abcdef";
    	//错误示范
    	int sz1 = strlen(arr);
    	//正确示范
    	size_t sz = strlen(arr);

    注意点2

    注意函数的返回值为size_t,是无符号的( 易错 )

    //3 - 8 < 0?
    //strlen函数是size_t类型,是无符号的,必定大于0!!!
    int main()
    {
    	if (strlen("abc") - strlen("abcdefgh") > 0)
    	{
    		printf("哈哈哈~~");
    	}
    	else
    		printf("吼吼吼!");
    	return 0;
    }
    //运行结果是   哈哈哈~~

    对比代码:

    int main()
    {
    	if ((int)strlen("abc") - (int)strlen("abcdefgh") > 0)
    	{
    		printf("哈哈哈~~");
    	}
    	else
    		printf("吼吼吼!");
    	return 0;
    }
    //运行结果是   吼吼吼!

    2.strcpy

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

    • 源字符串必须以 '\0' 结束。
    • 会将源字符串中的 '\0' 拷贝到目标空间。
    • 目标空间必须足够大,以确保能存放源字符串。
    • 目标空间必须可变。( 即:不能是不可修改的常量字符串 )
    • 学会模拟实现。

    讲解:

    注意点1:

    我们发现,copy时,将源字符串毫无保留的( 包括末尾的 '\0' )一块copy到目标字符串中!!

    注意点2:

    如果源字符串中间本身就含有'\0',那么我们同样还是取到遇见的第一个‘\0' ,不会继续往后打印的!!!

    注意点3:

    目标空间必须足够大,以确保能存放源字符串。

    	//错误示范
    	//目标字符串空间太少
    	char arr1[] = "xxx";
    	char arr2[] = "hello\0abc";
    	strcpy(arr1, arr2);

    注意点4:

    目标空间必须可变。

    模拟strcpy函数

    代码1:

    #include<stdio.h>
    #include<assert.h>
    void* my_strcpy(char* dest, const char* src)
    {
    	assert(dest && src);
    	char* ret = dest;
    	while (*src)
    	{
    		*dest = *src;
    		dest++;
    		src++;
    	}
    	*dest = '\0';
    }
    int main()
    {
    	char arr1[] = "xxxxxxxxxxxxxxxx";
    	char arr2[] = "abc";
    	my_strcpy(arr1, arr2);
    	printf("%s", arr1);
    	return 0;
    }

    代码2:(升级版~~)

    #include<stdio.h>
    #include<assert.h>
    char* my_strcpy(char* dest, const char* src)
    {
    	assert(dest && src);
    	char* ret = dest;
    	while (*dest++ = *src++)
    	{
    		;
    	}
    	return ret;
    }
    int main()
    {
    	char arr1[] = "xxxxxxxxxxxxxxxx";
    	char arr2[] = "abc";
    	printf("%s", my_strcpy(arr1, arr2));
    	return 0;
    }

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注海外IDC网的更多内容!

    【文章出处:国外服务器 转发请说明出处】