C语言中字符串库函数的介绍

一、求字符串长度

strlen

它的函数的参数,用来计算’\0’前面的字符有多少个

size_t strlen ( const char * str );
这里的const是只想计算大小而不改变它,后面的函数同此

size_t是无符号整数的类型,这里求出的字符串长度只可能大于等于0
这里也出现了一个问题,因为它是无符号类型,所以在进行相减的时候可能出现负数,如下面这个例子,我们比较两个字符串的大小,看打印出来的是什么
在这里插入图片描述

可以看到打印出来的是大于,因为计算的结果是负数,而负数在内存中存放的是补码,而size_t就把补码当成了一个无符号类型的数,所以这个数远大于0,就打印出大于。

关于strlen函数需要注意的是:
1、字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2、参数指向的字符串必须要以 ‘\0’ 结束。
3、注意函数的返回值为size_t,是无符号的

下面我们来看strlen函数的模拟实现
大致分为三种方法
第一种最常见的是计数器法

int main()//模拟strlen的实现
{
	char arr[5] = "asdf";
	printf("%u ",my_strlen(arr));
	
	return 0;
}
size_t my_strlen(const char* p)
{
	int count=0;
	while (*p)
	{
		count++;
		p++;
	}
	return count;
}

第二种是用递归的方法:

int main()//模拟strlen的实现
{
	char arr[5] = "asdf";
	printf("%u ",my_strlen(arr));
	
	return 0;
}
size_t my_strlen(const char* p)//2.递归的方式
{
	if (*p == '\0')
		return 0;
	else
		return 1 + my_strlen((p + 1));
}

第三种是指针的方法:

int main()//模拟strlen的实现
{
	char arr[5] = "asdf";
	printf("%u ",my_strlen(arr));
	
	return 0;
}
size_t my_strlen( char* p)
{
	char* p1 = p;
	while (*p)
	{
		p++;
	}
	return p - p1;

}//**两个指针相减的结果是两指针之间元素的个数**

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

strcpy

定义:char* strcpy(char * destination, const char * source );这里函数的返回类型是destination的地址
作用是将源指向的 C 字符串复制到目标指向的数组中,并且包含了’\0’.
如下面的这个代码
在这里插入图片描述
那我们怎么看见把arr2里的’\0’也传进arr1了呢,我们打开监视窗口
在这里插入图片描述
再按一次f11后
在这里插入图片描述

就变成了上图的数组,然后‘x’后面遇到了’\0’,所以后面的"world"就没有打印出来了。
下面是该函数的注意点
1.源字符串必须以 ‘\0’ 结束。
2.会将源字符串中的 ‘\0’ 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变。//比如字符串常量不能更改,就不能用该函数

下面我们来模拟实现strcpy函数

#include<assert.h>
char* my_strcpy( char* p1, const char* p2)
{
	char* ret = p1;
	assert(p1 && p2);
	while (*p1++=*p2++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello world";
	char arr2[] = "xxxxx";
	printf("%s", my_strcpy(arr1, arr2));
	return 0;
}

这里assert是用来断言两个指针不是空指针,若果是,则会报错,需要包含<assert.h>这个头文件。printf("%s", my_strcpy(arr1, arr2));而这里直接把函数返回的char*给printf函数,这叫链式访问,上一个函数的返回类型传递给下一个函数。

strcat

定义char * strcat ( char * destination, const char * source );
作用是将源字符串追加到目标字符串的’\0处’
下面是该函数的注意事项:
1.源字符串和目标字符串都必须以 ‘\0’ 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。
4.追加是会将目标函数的‘\0’覆盖
如下面这个例子

在这里插入图片描述
接下来我们还是来模拟实现以下这个函数

char* my_strcat(char* p1, const char* p2)
{
	char* ret = p1;
	assert(p1 && p2);
	while (*p1)
	{
		p1++;
	}
	while (*p1++=*p2++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr[30] = "hello";
	char arr2[] = "xxxx";
	my_strcat(arr, arr2);
	printf("%s", arr);
	return 0;
}

接着我们来思考一个问题,就是字符串能给自己追加呢?

显然是不行的,例如这个字符串"hello",你把一个hello传到hello后面的’\0’的时候它自身就发生了变化,所以字符串结尾就没有\0这一说法了

strcmp

定义int strcmp ( const char * str1, const char * str2 );
作用是此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或达到终止 null 字符。
比如比较"abc"和"acd",先比较’a’的大小,相同的情况下就比较下一个’b’和’c’的大小,显然后者更大,所以就说第二个字符串更大
返回值p1<p2,return 小于0;p1>p2 return大于0.

接下来我们依然来模拟实现一下该函数:

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);

	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;

		str1++;
		str2++;
	}

	return (*str1 - *str2);
}
int main()
{
	char arr1[] = "adfsd";
	char arr2[] = "fsefasefa";
	printf("%d", my_strcmp(arr1, arr2));
	return 0;
}

三、长度受限制的字符串函数

strncpy strncat strncmp

这三个函数和strcpy strcat strcmp的区别就是函数多了一个参数
如下图
在这里插入图片描述
作用就是拷贝/覆盖/比较规定的元素个数,更加的精准了,用法也很简单,只用在函数参数最后再加上要比较元素的个数即可。注意这里strncat可以给自己追加。

四、字符串查找

strstr

定义:`char * strstr ( const char *str1, const char * str2);
作用是返回指向 str1 中 str2 第一次出现的指针,如果 str2 不是 str1 的一部分,则返回 null 指针。
如下面的例子:
在这里插入图片描述

下面我们依旧来模拟实验这个函数

char* my_strstr(char* p1, char* p2)
{
	char* ptr = p1;
	char* s = ptr;
	char* p3 = p2;
	assert(p1 && p2);
	while (*p1)
	{
		s = ptr;
		p3 = p2;
		while(s && p3&& *s == *p3)
		{
			s++;
			p3++;
		}
		if (*p3 =='\0')
			return ptr;
		ptr++;
	}
	return NULL;
	
}
int main()
{
	char arr1[] = "sadfsaaaa";
	char arr2[] = "fsa";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("%s", ret);
	}
	else
		printf("找不到");
	return 0;
}

strtok

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

下面我们来看一个例子:
在这里插入图片描述
就成功把这个字符串分隔开了

五、错误信息报告

strerror

定义:char * strerror ( int errnum );
作用是获取指向错误消息字符串的指针
下面一个例子:
在这里插入图片描述
如果我们在用一个函数的时候发生错误,但是我们并不能判断出错误出在哪里,就可以用该函数
注:库函数在执行错误的时候,会把错误码放在errno这个变量当中,errno是C语言提供的一个全局变量
如:在这里插入图片描述

这里就能很清楚的知道错误出在哪里,当然我们可以用一个更为方便的函数perror,在这里插入图片描述
它就直接等于在这里插入图片描述
更为方便简单了

————————————————————————————————————————————
以上就是我总结的C语言中字符春库函数的全部内容,若有错误,欢迎指正,谢谢大家!

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值