C语言字符串函数笔记(初始版)

#define  _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include 

//int main()
//{
//	//char arr[] = "abc\0def";
//	char arr[] = { 'a', 'b', 'c' };//随机值
//	int len = strlen(arr);
//	printf("%d\n", len);
//	return 0;
//}


strlen函数的返回类型是size_t - 无符号整形
//int main()
//{
//	if (strlen("abc") - strlen("abcdef") > 0)
//	{
//		printf(">\n");
//	}
//	else
//	{
//		printf("<=\n");
//	}
//	return 0;
//}


srtlen函数的三种模拟实现方法
1.计数器
//int my_strlen(const char* str)//返回类型也可以是size_t
//{
//	int count = 0;
//	assert(str);//断言,为了防止str是一个空指针
//	while(*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}


2.递归
不创建临时变量,求字符串的长度
//int my_strlen(const char* str)
//{
//	assert(str);
//	if (*str != '\0')
//	{
//		return 1 + my_strlen(str + 1);
//	}
//	else
//	{
//		return 0;
//	}
//}

3. 指针 - 指针
//size_t my_strlen(const char* str)
//{	
//	assert(str);
//	const char* start = str;//字符串的起始位置就是str
//	const char* end = str;
//	while (*end != 0)//用来找到字符串的末尾处
//	{
//		end++;
//	}
//	return end - start;//指针 - 指针,很巧妙的得到了字符串的长度
//}

//int main()
//{
//	char arr[] = "bit";
//	int len = my_strlen(arr);
//	printf("%d\n", len);
//	return 0;
//}


//int main()
//{
//	strcpy函数的正确使用
//	//char arr1[] = "abcdefghi";
//	//char arr2[20] = "";
//	//strcpy(arr2, arr1);
//	//printf("%s", arr2);
//
//
//	下面使两个错误示范
//	这个是一个错误的示范, - 目标空间必须可以修改
//	//char* p = "abcdefghi";//这个是字符串常量
//	//char arr[20] = "hehe";
//	//strcpy(p, arr);
//	//printf("%s", *p);
//
//	这个也是一个错误的示范, - 目标空间必须足够大
//	//char arr1[20] = "abcdefghi";
//	//char arr2[3] = "";
//	//strcpy(arr2, arr1);
//	//printf("%s", arr2);
//
//	char arr1[] = "qwertyuiop";
//	//char arr2[20] = arr1;//err 一种很笨的操作
//	char arr2[20] = { 0 };
//	//arr2 = arr1;//err 这个也很笨
//
//	return 0;
//}

//返回的是目标空间的起始地址
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

//int main()
//{
//	char arr1[] = "hehe";
//	char arr2[20] = { 0 };
//	//my_strcpy(arr2, arr1);
//	//printf("%s", arr2);
//	printf("%s", my_strcpy(arr2, arr1));//运用函数的返回值打印,这个也叫链式访问
//	return 0;
//}


//int main()
//{
//	char arr1[20] = "hello \0xxxxxxxxxx";//从起始目标\0的位置开始
//	char arr2[] = "world";//从目标的\0结束
//	//追加
//	strcat(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

返回的也是目标空间的起始地址
//char* my_strcat(char* dest, const char* src)
//{
//	char* ret = dest;
//	assert(dest && src);
//	//找到目标空间的\0
//	while (*dest != '\0')
//	{
//		dest++;
//	}
//	//拷贝
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
//int main()
//{
//	//char arr1[20] = "bit";
//	char arr1[20] = "hello ";
//	char arr2[] = "world";
//	//my_strcat(arr1, arr2);
//	//printf("%s\n", 	my_strcat(arr1, arr2));//这样也可以
//	my_strcat(arr1, arr1);//err,这样会陷入死循环,因为只有一个\0
//	printf("%s\n", arr1);//不能自己追加自己
//	return 0;
//}


//int main()
//{
//	//char* p = "abcdef";//这里的p存放着首字符的地址
//	//if("abcdef" == "bbcdef")//err 这里比较的是两个字符串首字符的地址,而不是字符串的内容
//	
//	char arr1[] = "abq";
//	char arr2[] = "abc";
//	int ret = strcmp(arr1, arr2);
//	printf("%d\n", ret);// 1  这里是大于 这里比较的是不相同字符的ASCLL码值
//	return 0;
//}

//模拟实现strcmp函数
//int my_strcmp(const char* str1, const char* str2)
//{
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//		{
//			return 0;
//		}
//		str1++;
//		str2++;
//	}
//	//改进版
//	return *str1 - *str2;
//
//	//if (*str1 > *str2)
//	//{
//	//	return 1;
//	//}
//	//else
//	//{
//	//	return -1;
//	//}
//}
//
//int main()
//{
//	char arr1[] = "abzqw";
//	char arr2[] = "abq";
//	//int ret = my_strcmp(arr1, arr2);
//	//printf("%d\n", ret);
//	if (my_strcmp(arr1, arr2) > 0)
//	{
//		printf(">\n");
//	}
//	return 0;
//}


//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[5] = "";//等价于char arr2[5] = {0}
//	strcpy(arr2, arr1);
//	printf("%s\n", arr2);//会有溢出问题
//	return 0;
//}

//如果源字符串的长度小于num(3),则拷贝完源字符串之后,在目标的后边追加\0,直到num个
// 
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[] = "xxxxxxxxxxx";
//	strncpy(arr2, arr1, 3);
//	printf("%s\n", arr2);
//	return 0;
//}


//int main()
//{
//	char arr1[20] = { "hello x\0xxxxxxxxxx" };
//	char arr2[] = "abcdef";
//	strncat(arr1, arr2, 8);
//	printf("%s\n", arr1);
//	return 0;
//}


//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[] = "abcq";
//	int ret = strncmp(arr1, arr2, 3);
//	printf("%d\n", ret);
//	return 0;
//}

//
// 比较到出现另一个字符不一样或者一个字符串结束或者num个字符全部比较完
//
//int main()
//{
//	char arr1[] = "abbq";
//	char arr2[] = "abbq";
//	int ret = strncmp(arr1, arr2, 8);//因为只有5个字节,所以不影响
//	printf("%d\n", ret);
//	return 0;
//}


//strstr函数的使用
// 
//int main()
//{
//	char arr1[] = "abcdebcdf";
//	char arr2[] = "bcd";
//
//	char *p = strstr(arr1, arr2);//查找字符串中第一次出现的字符串
//	//printf("%s\n", p);//查找到的话就返回那个地方的地址,没有查找到的话就返回NULL(空指针)
//	if (p == NULL)
//	{
//		printf("找不到\n");
//	}
//	else
//	{
//		printf("%s\n", p);
//	}
//	return 0;
//}



//模拟实现strstr函数

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

int main()
{
	char arr1[] = "abcdebcdf";
	char arr2[] = "bcd";

	char *p = strstr(arr1, arr2);//查找字符串中第一次出现的字符串
	//printf("%s\n", p);//查找到的话就返回那个地方的地址,没有查找到的话就返回NULL(空指针)
	if (p == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", p);
	}
	return 0;
}


//小结
//strcpy
//strcat
//strcmp   这些都是长度不受限制的字符串函数

//strncpy
//strncat
//strncmp  这些是长度受限制的字符串函数

//注意
//strcat这个函数是不适合自己给自己追加的!!!
//strncat函数是可以自己给自己追加的~

你可能感兴趣的:(C语言之旅,c语言,笔记,算法)