Bootstrap

总结——字符串函数

博客IDLanFuRen
C系列专栏C语言重点部分  C语言注意点  C++基础  Linux  数据结构  C++注意点
声明等级:黑色->蓝色->红色
欢迎新粉加入,会一直努力提供更优质的编程博客,希望大家三连支持一下啦

目录

1.strlen的使用

1)学会看c语言官网来使用其中的库函数(cpp官网)

2)strlen的使用

3)strlen使用的注意事项

4)strlen模拟实现

2.strcpy的使用

1)strcpy的官网使用简介

2)strcpy的使用&注意事项

3)strcpy的模拟实现

3.strcat的使用

1)strcat的官网使用简介

2)strcat的使用&总结代码及运行如下:

3)strcat模拟实现

4.strcmp的使用 


今天来总结一下C语言中字符串函数的使用及其模拟实现(与库函数的真正实现是有区别的,但是可以模拟出相同的结果)。

1.strlen的使用

1)学会看c语言官网来使用其中的库函数(cpp官网

在search一栏中选择你想要查找的库函数即可跳转对应库函数。

 最先注意到的应该是这个东西——size_t strlen(const char*str);我们来解读一下,size_t是该函数的返回值,形参接收的是一个字符串,用const修饰是不希望改变实参的值。

用红框圈出来的是头文件,我们在使用该函数的时候需要包含string.h

 这是该库函数的具体使用细则:returns the length of the C string str,大意就是该函数的作用是得出字符串的长度。

2)strlen的使用

直接上代码,看看实力:

#include<stdio.h>
#include<string.h>
int main()
{
	printf("%d", strlen("abc"));
	return 0;
}

 这是代码运行的结果:

说明以上的解释是没有问题的。

3)strlen使用的注意事项

注意在使用时,strlen函数是遇到'\0'才会停止,那为什么上面的代码没用问题?那是因为字符串末尾会隐藏'\0',我们拿一个错误代码来试试。

 出现了随机值。

4)strlen模拟实现

#include<stdio.h>
#include<string.h>
size_t my_strlen(const char* str)
{
	int count = 0;//定义一个计数器来计算字符串的大小
	while (*str != '\0')//遇到'\0'就退出循环
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[10] = "abc";
	size_t ret = my_strlen(arr);
	printf("%zd", ret);
	return 0;
}

2.strcpy的使用

1)strcpy的官网使用简介

我们从中可以看出该函数的返回类型是char*(也就是说返回的是一个地址),形参有两个,一个是起始字符串(destination),另一个是想要拷贝过去的字符串(source)。

该函数的作用是将目标字符串拷贝替换到原字符串里

2)strcpy的使用&注意事项

int main()
{
	char arr1[10] = "abcdef";
	char arr2[10] = "abc";
	strcpy(arr1, arr2);
	printf("%s ", arr1);
}

 运行结果:

那有的人不禁会问到:那Arr2里面的'\0'会一起打印吗?我们先思考一下:如果没有这个\0,那不就会一直往下打印吗,一直往下打印那得打印到abcdef才结束呀,所以我们的思考是会打印,但实践是检验真理的唯一标准。 

通过调试可以很清楚地看到'\0'的补入。 

总结:

源字符串必须以 '\0' 结束。

会将源字符串中的 '\0' 拷⻉到⽬标空间。
⽬标空间必须⾜够⼤,以确保能存放源字符串。

⽬标空间必须可修改。

3)strcpy的模拟实现

char* my_strcpy(char*dest,char*src)
{
	char* ret = dest;//保证一直指向空间(首元素)
	assert(dest && src);
	while (*src != '\0')
	{
		*dest = *src ;
		dest++;
		src++;
	}
	*dest = *src;//这一步是为了补齐'\0'
	return ret;
}

int main()
{
	char arr1[10] = "abcdef";
	char arr2[10] = "abc";
	char*ret=my_strcpy(arr1, arr2);
	printf("%s ",ret );//无需解引用就是打印字符串因为字符串在打印的时候需要一个首地址就行了
}

可能有的注意细节的朋友们注意到一点:为什么有assert(dest && src);这个语句呢?其实这个是作为断言使用的库函数,相当于判断语句若不满足条件就直接终止程序且报错。 而且是暴力判断。

其实还有一个更简单的方法,之后会在博客里补齐,关注我不迷路。 

3.strcat的使用

1)strcat的官网使用简介

分析一下这一段文本,原字符串必须可修改,而source用const修饰证明需要保证其不能修改。

很明显,append是追加的意思,所以该函数的目的是在原有的字符串的基础上追加字符串source

2)strcat的使用&总结

代码及运行如下:

int main()
{
	char arr1[10] = "abc";
	char arr2[] = "abc";
	printf("%s", strcat(arr1, arr2));
}

 可以看出,是追加的意思没错。

3)strcat模拟实现

分析问题:

既然是追加,我们自定义函数my_strcat的参数一个是原字符串,一个是追加字符串。

我们要在原字符串后面追加,得需要有个标记,而且原字符串的每一个字符都要打印,那么'\0'就至关重要,所以我们第一步是要通过循环来找到'\0'的地址

找到之后我们便可通过另一个循环将目标字符串拷贝到原字符串中,就实现了追加

来看代码:

char* my_strcat(char*dest,char*src)
{
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "abc";
	char arr2[] = "abc";
	char*ret=my_strcat(arr1, arr2);
	printf("%s ",ret);
	return 0;
}

4.strcmp的使用 

经过三轮的文本查看,想必大家已经熟练掌握如何看官网了,我们直接来看模拟实现。

首先我们通过查看官网发现这是一个实现字符串比较大小的函数

我们可以得知返回值的情况。注意:abcdf与abq比较是abq大,是按照顺序通过ASCII码值依次比较的,而不是数量或者其他指标。

代码模拟实现:

int my_strcmp (const char * str1, const char * str2)
{
    int ret = 0 ;
    assert(src != NULL);
    assert(dest != NULL);
    while(*str1 == *str2)//依次比较
    {
        if(*str1 == '\0')//这一步相当于str1和str2但是'\0'
            return 0;
        str1++;
        str2++;
    }
    return *str1-*str2;//比较ASCII值
}

;