C语言 字符串函数的详解!!

本篇文章介绍字符串函数的使用以及模拟实现,这些字符串函数都需要包含头文件 string.h ,正文开始!

一.strlen的使用与模拟实现

size_t strlen (const char* str)

1.函数strlen是用来计算字符串长度的。

2.参数str指向的字符串必须以 ‘\0’ 结束。

3.strlen函数是返回的是在字符串中 ‘\0之前出现的字符个数(不包含‘\0’)。

4.返回值是 size_t 类型,是无符号的!

strlen的模拟实现:

1.以计数器的方法模拟实现

size_t my_strlen(const char* str)
{
	assert(str);//断言,防止传递空值,需要头文件 assert.h
	size_t count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

2.不创建临时变量模拟实现(采取递归的方法)

size_t my_strlen(const char* str)
{
	assert(str);//断言,防止传递空值,需要头文件 assert.h
	if (*str == '\0')
		return 0;
	return 1+my_strlen(str+1);
}

3.我们知道 |指针-指针| 的输出结果为之间的元素个数,所以可以用 指针-指针 的方式模拟实现、

size_t my_strlen(const char* str)
{
	assert(str);//断言,防止传递空值,需要头文件 assert.h
	char* a = str;
	while (*a)
	{
		a++;
	}
	return a-str;
}

二.strcpy的使用和模拟实现

strcpy的使用

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

1.函数strcpy是字符串拷贝函数,返回值为 char*。

2.参数source类型为 const char* ,表示要拷贝源字符串(const在*左边修饰说明源字符串内容不可修改);参数destination类型为 char* ,表示要拷贝到的目标空间。

3.源字符串必须以 ‘\0’ 结束,并且会将 ‘\0’ 拷贝到目标空间 。

4.目标空间必须足够大,要确保可以存放下源字符串,并且要保证目标空间可修改。

strcpy模拟实现:

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;//存储首元素地址
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

三.strcat的使用和模拟实现

char* strcat(char* destination,const char* source)

1.函数strcat是字符串追加函数,将源字符串从目标字符串 ‘\0’ 处开始追加。

2.源字符串必须以 ‘\0’ 结束。

3.目标字符串也必须以 ‘\0’ 结束,否则不知道从哪开始追加。

4.目标空间必须足够大,要足够容纳源字符串大小,且目标空间可修改。

strcat模拟实现:

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;//存储首元素地址
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

四.strcmp的使用和模拟实现

int strcmp(const char* str1,const char* str2)

1.函数strcmp是用来比较两个字符串大小的。

2.返回值为 int 类型,标准规定:第一个字符串大于第二个字符串时,返回大于0的数字;第一个字符串等于第二个字符串时,返回0;第一个字符串小于第二个字符串时,返回小于0的数字。

3.函数strcmp是通过比较两个字符串中对应位置上字符的ASCII码值大小来判断的。举个例子:

char* exm1="abcde"       char* exm2="adc"    strcmp(a,b)的返回值是什么呢?答案返回的是小于零的数。

因为strcmp是从每个字符串的第一位开始比较对应位置上字符的ASCII码值大小,如果这两个字符串对应位置上的字符相等,则都往后递推一位;在第二个位置上的字符exm1为 ‘b’,exm2为 ‘d’,'d' 的ASCII值比‘b’大, 所以exm2>exm1,返回值小于0。

strcmp的模拟实现:

char* my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	int ret = 0;
	while (*str1==*str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return str1 - str2;
}

接下来要介绍的是长度受限制的字符串函数,这种字符串函数主要用于确保字符串不会超出预先设置的长度限制,以避免内存溢出等问题,保证了程序的安全性和稳定性。

五.strncpy的使用

char* strncpy(char* destination,const char* source,size_t num)

1.strncpy函数是用于将源字符串(source指向的字符串)的前num个字符拷贝到目标空间(destination指向的空间)。

2.源字符串的长度小于num时,拷贝完源字符串后,在目标后边追加 ‘\0’ 直到num个。

上例图!!!将str2的前三个字符拷贝到str1。

六.strncat的使用

char* strncat(char* destination,const char* source,size_t num)

1.strncat函数是字符串追加函数,是将源字符串(source指向的字符串)的前num个字符追加到目标空间(destination指向的空间)的末尾,再追加一个 ‘\0’ 。

2.源字符串长度小于num时,只会将源字符串中到 ‘\0’ 之前的内容追加到目标空间末尾。

举个例子:将str2的前四个字符追加到str1末尾。

七.strncmp的使用

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

1.字符串比较函数strncmp,比较str1和str2前num个字符,如果相等就继续向后比较,最多比较num个字母。

2.如果在num个字母前发现不一样:str1大于str2,返回大于0的数;str1小于str2,返回小于0的数。如果num个字符都相等,就返回0。

如图所示,输出的值小于0,说明str1<str2

八.strstr的使用和模拟实现

char* strstr(const char* str1,const char* str2)

1.strstr函数是用来查找字符串的,返回值为 char* 类型,返回的是字符串str2在字符串str1中第一次出现的位置。

2.如果字符串str2在字符串str1中找不到,则返回一个空指针。

如图所示:

strstr模拟实现

char* my_strstr(const char* str1, const char* str2)
{
	char* pcur = (char*)str1;
	char* s1, *s2;
	if (str2 == NULL)
		return ((char*)str1);
	while (*pcur)
	{
		s1 = pcur;
		s2 = (char*)str2;
		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == NULL)
			return pcur;
		pcur++;
	}
	return (NULL);
}

以上便是strstr的模拟实现。

九.strtok函数的使用

char* strtok(char* str,const char*sep)

1.strtok函数是用来分割字符串的。

2.第一个参数指向了一个包含0个或多个由sep字符串中一个或多个分隔符分割的标记。

3.strtok函数找到str中的下一个标记, 并将其用‘\0’结尾,返回一个这个标记的指针。

4.strtok函数的第一个参数不为NULL时,函数找到str中的第一个标记,strtok将保存他在字符串中的位置。

5.strtok函数第一个参数为NULL时,函数将从同一个字符串中被保存的位置开始,查找下一个标记。

6.如果字符串中不存在更多的标记,则返回NULL。

注:strtok函数会改变被操作的字符串,所以我们使用strtok函数时通常用临时拷贝的内容并且可修改。

这么听上去可能很难理解,举个例子:

如图,str2中的分隔符为 | '

for循环中的:strtok(str1,str2)作用是(第4点)找到str中的标记,strtok将保存他在字符串中的位置,并返回这个标记的指针(标记之前的所有字符);str(NULL,str2)的作用是(第五点)函数将从同一个字符串中被保存的位置开始,查找下一个标记。这样便构成了这个for循环。

其实从输出结果我们可以看出,就是将字符串从分隔符的位置把字符串分解成一个个小字符串。

十.strerror函数的使用

char* strerror(int errnum)

1.strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回,程序启动时参数errnum为0。

2.需要使用的头文件除了 string.h 外还需要 errno.h 。

如图所示打印了1-10对应的错误信息字符串。

下图为代码演示:

以上便是本篇的全部内容,如有错误,欢迎大家在评论区指出,讨论。制作不易,给个三连吧。

  • 40
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值