C语言进阶(字符串函数及模拟实现strncpy&strncat&strncmp&strstr&strtok&strerror)2

发布时间:2022-08-19 11:45

目录

前言

一、字符串函数是什么

二、字符串函数包括哪些、如何模拟实现

1.长度受限制字符串函数

1.字符串拷贝函数

(1)strncpy函数的注意事项

(2)strncpy函数的模拟实现

2.字符串追加函数

(1)strncat函数注意事项

(2)strncat函数模拟实现

3.字符大小比较函数

(1)strncmp函数注意事项

4.字符串查找函数

(1)strstr函数注意事项

(2)strstr函数的模拟实现

5.切割字符串函数

(1)strtok函数注意事项

(2)strtok函数的模拟实现

6.把错误码转换成错误信息函数

(1)strerror函数的注意事项

(2)strerror函数的模拟实现


前言

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

一、字符串函数是什么

字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数。

二、字符串函数包括哪些、如何模拟实现

1.长度受限制字符串函数

1.字符串拷贝函数

(1)strncpy函数的注意事项

拷贝num个字符从源字符串到目标空间。

如果源字符串的长度小于num,则拷贝完原字符串之后,

在目标的后边追加0,直到num个。

(2)strncpy函数的模拟实现

#include
#include
char* my_strncpy(char* str1, const char* str2, int nums)
{
	assert(str1 && str2);
	char* ret = str1;
	while (nums)//把str2拷贝到str1,剩余\0没拷贝
	{
		*str1++ = *str2++;
		nums--;
	}
	if (nums > 0)
	{
		while (--nums)//拷贝/0
		{
			*str1++ = '\0';
		}
	}
	return ret;
}
int main()
{
	char arr1[20] = "############";
	char arr2[] = "bit education";
	my_strncpy(arr1, arr2, 4);
	printf("%s\n", arr1);

	return 0;
}

2.字符串追加函数

(1)strncat函数注意事项

追加num个字符从源字符串到目标空间

如果源字符串的长度小于num,追加完之后也会把\0追加过去,但如果字符不够不会补齐\0

(2)strncat函数模拟实现

 

#include
#include
char* my_strncat(char* str1, const char* str2, int num)
{
	char* ret = str1;
	assert(str1 && str2);
	while (*str1)
	{
		str1++;
	}
	while (num--)
	{
		if ((*str1++ = *str2++) == 0)
		{
			return ret;
		}
		
	}
	*str1 = '\0';
	return ret;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	my_strncat(arr1, arr2, 4);
	printf("%s\n", arr1);

	return 0;
}

3.字符大小比较函数

(1)strncmp函数注意事项

比较到出现另一个字符不一样或者一个字符串结束或者num个字符全部比较完

4.字符串查找函数

(1)strstr函数注意事项

返回一个指针中str2在str1第一次出现的位置

(2)strstr函数的模拟实现

#include
#include

char* my_strstr(const char* str1, const char* str2 )
{
	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	char* ret = str1;
	while (*ret)
	{
		s1 = ret;
		s2 = str2;

		while (*s1 && *s2 && (*s1 == *s2))
		{
			
				s1++;
			    s2++;
				if (*s2 == '\0')
				{
					return ret;
				}
		}
		ret++;
	}
	return NULL;
}
int main()
{
	char arr1[20] = "abbbcdef";
	char arr2[] = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("找到了:>%s\n", ret);
	}
	else
	{
		printf("查找的字符串找不到\n");
	}

	return 0;
}

5.切割字符串函数

(1)strtok函数注意事项

第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。 strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。 如果字符串中不存在更多的标记,则返回 NULL 指针。

(2)strtok函数的模拟实现

#include



int main()
{
	char arr1[20] = "abb@bc.def";
	char arr2[20] = { 0 };
	char *p = "@.";
	strcpy(arr2, arr1);
	/*printf("%s\n", strtok(arr2, p));
	printf("%s\n", strtok(NULL, p));
	printf("%s\n", strtok(NULL, p));*/
	char* ret = NULL;
	for (ret = strtok(arr2, p); ret != NULL; strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	//第一次穿非空指针,第二次传空指针
	//strtok函数的第一个参数不为NULL,函数将找到arr2中的第一个标记,strtok函数将保存他在字符串中的位置。
	//strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
	return 0;
}


6.把错误码转换成错误信息函数

(1)strerror函数的注意事项

返回错误码,所对应的错误信息。

(2)strerror函数的模拟实现

#include
#include
#include

     //int errno;//全局错误码,存放错误信息的变量
int main()
{
	FILE* pf = fopen("test.txt", "r");//打开文件失败返回NULL
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	return 0;
}

总结

本文仅仅简单的介绍了常用字符串函数的使用,C语言给我们提供了大量能使我们方便快捷的处理数据的函数和方法,我们要更加深入的了解,自己学会怎么看怎么使用不认识的库函数,另外,文章如果有任何问题,欢迎大佬提出疑问。我会虚心学习和改正,最重要的是能共同进步,共同成长,学好编程。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号