字符函数和字符串函数上(超详细)干货满满

字符函数和字符串函数上(超详细)干货满满_第1张图片

 

前言:很多事情先有念头,后来才有了行动,只要坚持,总会在这个过程中收获很多,博客质量也会慢慢提升!
我知道想要达到高级的水平,需要不断的学习,在这个过程会吸收大量知识,而人的记忆是有限的。
所以每隔一段时间,将学习的东西整理出来,发表成博客,可以方便自己的学习和巩固。
想到种种,我想,把之前写的印象笔记整理出来吧,写博客倒是一条不错的选择!
今天小编带大家深入剖析,部分字符函数和字符串函数,相信大家咱看完,都有不小的收获!!

目录

一:求字符串长度(strlen)

1.字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包

2.参数指向的字符串必须要以 '\0' 结束,如果不是以'\0'结束会产生随机值

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

4.传进函数的为地址

​编辑

 5.strlen模拟器的实现

1.递归的方法

2.指针-指针

3.计数器的方法

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

1.strcpy:

​编辑

 错误的拷贝方法

 越界访问

 '\0'的位置不确定

​编辑

目标区域不可以修改

正确的拷贝方法

 模拟实现

 2:字符串追加strcat

实现

错误的实现 

​编辑 三:结语


一:求字符串长度(strlen)

1.字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包

'\0' )
#include
int main()
{
	char arr[] = "abcdef";//abcdef\0
	
	int len = strlen(arr);

	printf("%d\n", len);

	return 0;
}

字符函数和字符串函数上(超详细)干货满满_第2张图片

 

函数的返回值为6,'\0'前边有6个字符

2.参数指向的字符串必须要以 '\0' 结束,如果不是以'\0'结束会产生随机值

#include
int main()
{
	
	char arr[] = { 'b', 'i', 't' };
	//[][][][][][b][i][t][][][][][][][]
	int len = strlen(arr);//随机值

	printf("%d\n", len);

	return 0;
}

字符函数和字符串函数上(超详细)干货满满_第3张图片

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

字符函数和字符串函数上(超详细)干货满满_第4张图片

在编译器中转到定义可以看到:

 

 我们可以清楚的看见strlen的返回值为size_t(unsigned int)。

错误写法:

//int main()
//{
//	//        3                  6
//	//if (strlen("abc") - strlen("abcdef") > 0)
//	if (strlen("abc") > strlen("abcdef"))
//	{
//		printf(">\n");
//	}
//	else
//	{
//		printf("<=\n");
//	}
//	return 0;
//}

返回值永远为正数。

4.传进函数的为地址

字符函数和字符串函数上(超详细)干货满满_第5张图片

如果传入的不为地址则则会发生访问错误

#include
int main()
{
	
	int len = strlen(1244);
	printf("%d\n", len);//返回随机值

	return 0;
}

字符函数和字符串函数上(超详细)干货满满_第6张图片

 5.strlen模拟器的实现

1.递归的方法

int My_strlen(const char *str)
{
	assert(str != NULL);
	if (*str == '\0')      //检查是否已经到达字符串尾部
		return 0;
	return 1 + My_strlen(str + 1);
}

2.指针-指针

size_t My_strlen(const char *str)
{
	char *start = (char*)str;
	assert(str != NULL);
	while (*str)         //让str指针挪到指向字符串'\0'位置处
	{
		(char*)str++;
	}
	return str - start;     
}
int main()
{
	char arr[] = "abcdef";
	size_t n = My_strlen(arr);
	printf("%u\n", n);
	return 0;
}

3.计数器的方法

#include
#include
size_t my_strlen(const char* str)
{
	size_t count = 0;
	assert(str);
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	size_t n = my_strlen(arr);
	printf("%u\n", n);
	return 0;
}

返回值为6,assert函数判断若指针为空则报错

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

1.strcpy:

字符函数和字符串函数上(超详细)干货满满_第7张图片

 

字符函数和字符串函数上(超详细)干货满满_第8张图片

注意:拷贝到'\0',后便会停下,源字符串必须以 '\0' 结束

#include
//#include
int main()
{
	char name[20] = { 0 };

	strcpy(name,"ab\0cde");

	//name = "zhansan";//err,name数组名是地址,地址是一个常量值,不能被赋值

	printf("%s\n", name);

	return 0;
}

字符函数和字符串函数上(超详细)干货满满_第9张图片

 字符函数和字符串函数上(超详细)干货满满_第10张图片

会将源字符串中的 '\0' 拷贝到目标空间,当然'\0',也会被拷入但无法观看,我们可以通过监视内存观看

#include
//#include
int main()
{
	char name[] = "xxxxxxxxxxxx";

	strcpy(name,"ab\0cde");

	//name = "zhansan";//err,name数组名是地址,地址是一个常量值,不能被赋值

	printf("%s\n", name);

	return 0;
}

 字符函数和字符串函数上(超详细)干货满满_第11张图片

这里确实将'\0',拷入 

 错误的拷贝方法

 越界访问

目标空间必须足够大,以确保能存放源字符串
#include
int main()
{
	char name[3] = "";
	
	char arr[] = "abcdef";
	strcpy(name, arr);

	

	printf("%s\n", name);

	return 0;
}

数组中无法存放5各字符会出现越界访问,系统报错

字符函数和字符串函数上(超详细)干货满满_第12张图片

 '\0'的位置不确定

#include
int main()
{
	char name[5] ={0};
	char arr[] = {'a','b','c'};
	strcpy(name, arr);
	printf("%s\n", name);
	return 0;
}

字符函数和字符串函数上(超详细)干货满满_第13张图片

字符函数和字符串函数上(超详细)干货满满_第14张图片

 

目标区域不可以修改

#include
int main()
{
	char* p = "xxxxxxxxxx";
	char arr[] = "abc";
	strcpy(*p, arr);
	
	return 0;
}

系统会报错

正确的拷贝方法

#include
//#include
int main()
{
	char name[6] = { 0 };

	strcpy(name,"abcde");

	//name = "zhansan";//err,name数组名是地址,地址是一个常量值,不能被赋值

	printf("%s\n", name);

	return 0;
}

 字符函数和字符串函数上(超详细)干货满满_第15张图片

 模拟实现

#include
#include
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++)
		;
	return ret;
}
int main()
{

	char arr1[] = "abcdef";
	char arr2[20] = { 0 };
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);//abcdef

	return 0;
}

字符函数和字符串函数上(超详细)干货满满_第16张图片

 2:字符串追加strcat

 

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

 字符函数和字符串函数上(超详细)干货满满_第17张图片

在内存中的体现 

 字符函数和字符串函数上(超详细)干货满满_第18张图片

 字符函数和字符串函数上(超详细)干货满满_第19张图片

 注意:

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

实现

#include
#include
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//1. 找到目标空间的末尾\0
	while (*dest != '\0')
	{
		dest++;
	}
	//2. 拷贝字符串
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "hello ";
	my_strcat(arr1, "world");
	//自己给自己追加?
	//my_strcat(arr1, arr1);
	printf("%s\n", arr1);
	return 0;
}

字符函数和字符串函数上(超详细)干货满满_第20张图片

错误的实现 

#include
#include
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//1. 找到目标空间的末尾\0
	while (*dest != '\0')
	{
		dest++;
	}
	//2. 拷贝字符串
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "hello ";
	//my_strcat(arr1, "world");
	//自己给自己追加?
	my_strcat(arr1, arr1);
	printf("%s\n", arr1);
	return 0;
}

自己追加自己,结尾的'\0',会被覆盖造成死循环

字符函数和字符串函数上(超详细)干货满满_第21张图片 三:结语

今天小编带大家,对部分字符函数和字符串函数,进行深度剖析与理解,相信看完的小伙伴都有自己的收获,如果大家觉得小编写的不错,希望三连加关注哦,小编会继续努力,推出优质博文。

 字符函数和字符串函数上(超详细)干货满满_第22张图片

 

你可能感兴趣的:(C语言编程,大数据,c语言,开发语言,青少年编程,编辑器)