c语言str系列函数

strcat();
函数原型:
char* strcat(char* dest, const char* src)

 功 能:    将src 的 字符串追加到 dest后边

char* Strcat(char* dest, const char* src)
{
	if (NULL == src)
	{
		return dest;
	}
	char* add = dest;
	while (*add)
	{
		add++;
	}
	while (*src)
	{
		*add = *src;
		add++;
		src++;
	}
	*add = '\0';
	return dest;
}
strcmp()
函数原型:int strcmp(const char* str1,const char* str2)
功 能:  两个字符串比较
str1 < str2   返回负数
str1 == str2  返回0
str1 > str2   返回正数

int Strcmp(const char* str1,const char* str2)
{
	const char* pstr1 = str1;
	const char* pstr2 = str2;

	while (*pstr1 == *pstr2)
	{
		if (*pstr1 == 0)		  //这里一定要先判断 *pstr1 是否是 '\0'  如果是'\0',说明两个字符串都到了结尾
		{
			return 0;
		}

		pstr1++;
		pstr2++;
	}

	//到这里两种情况,第一种:一个字符串是 ‘\0’ ,一个是字符,
	//                第二种:两个都是字符
	return (*pstr1 - *pstr2);
}
strcpy()  
函数原型:char* strcpy(char* dest,const char* src);
功能为拷贝字符串内容到目的串,把src所指向的内容拷贝到dest

 当sizeof(dest)>=sizeof(src)时,拷贝正确,并在dest字符串后面加入'\0';
 当sizeof(dest)<sizeof(src)时,拷贝出错

char* Strcpy(char* dest, const char* src)
{
	if (NULL == src )
	{
		return NULL;
	}
	char* addr = dest;
	//最简洁的方法
	//while (*dest++ = *src++);

	//稍微复杂点
	while (*src)
	{
		*dest = *src;
		*dest++;
		*src++;
	}
   *dest = '\0'*/        //注意:这块在后边要加 ‘\0’;
  return addr;
}
strncpy()       //注意:如果dest中本身有字符串,那么复制的n个字符串只会覆盖前面的n个字符,dest本身后边的字符还在
函数原型:char *strncpy(char *dest,char *src,size_t n);
功能:将src 的前n个字符,赋值到dest中。
注意: 当n>=sizeof(src)时,拷贝正确,并在dest字符串后面加入'\0';
           当n<sizeof(src)时,只拷贝src前n - 1个字符串到dest,不会为dest字符串后面加入'\0';
char* Strncpy(char* dest, const char* src,size_t n)
{
	assert(dest && src);
	char* add = dest;  //先记录头指针,作为返回值

	//复杂法
	/*while (n && *src)
	{
		*dest = *src;
		dest++;
		src++;
		n--;
	}
	if (*src == '0')
	{
		*dest = '\0';
	}

	while (n--)
	{
		*dest = '\0';
	}*/

	//优化法
	while (n && (*dest++ = *src++))	   //这样可以把 src 的 '\0' 复制进去
	{
		n--;
	}

	while (n--)
	{
		*dest++ = '\0';
	}
	return add;
}
strlen()
函数原型:unsigned strlen(const char *str);
功能:功能为返回字符串str的长度(不包括'\0')。

strlen()  有好几种实现方法;
第一种     使用计数器法

unsigned Strlen_1(const char* str)
{
	unsigned count = 0;
	while (*str)
	{
		str++;
		count++;
	}
	return count;
}
第二种    指针相减法

unsigned Strlen_2(const char* str)
{
	const char* begin = str;
	while (*str)
	{
		str++;
	}

	return str - begin;
}
第三种:使用递归  这种方法很容易理解,但是函数递归调用费时间

unsigned Strlen_3(const char* str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + Strlen_3(str+1);
	}
}
strchr();
函数原型:char *strchr(char *str, char c)
功能:查找str中首次出现c的位置,如有,则返回出现位置,否则返回NULL。

char* Strchr(char* str, char c)
{									
	if (NULL == str)
	{
		return NULL;
	}

	while (*str != c)
	{
		if (*str == '\0')
		{
			return NULL;
		}
		str++;
	}
	return str;
}
strrchr()
函数原型:char *strrchr(char *str, char c)
功能:查找str中最后一次出现的位置,如果有,则返回出现位置,否则返回NULL;
char* Strrchar(char* str, char c)
{

	//普通法,从前向后查找,使用一个指针记录出现字符的位置,知道最后一个
	//缺点:需要遍历以便字符串,速度慢
	/*char* add = NULL;

	while (*str)
	{
		if (*str == c)
		{
			add = str;
		}
		str++;
	}
	if (NULL == add)
	{
		return NULL;
	}
	else
	{
		return add;
	}*/

	//优化法  	从字符串的最后一个结点向前遍历,
	//优点:一般情况下,速度效率高一些
	size_t len = strlen(str);
	char* Radd = str + len - 1;		   //字符串最后一个结点的地址   记得要 -1
	while (*Radd != c && Radd != str)  //                            不减一也行,Radd指的就是字符串的 ‘\0’位置
	{
		Radd--;
	}
	if (*Radd == c)
	{
		return Radd;
	}
	return NULL;
}
strrev()
原型:char *strrev(char *str)
功能:为反转字符串,返回字符串指针。

char* Strrev(char* str)
{
	if (NULL == str)
	{
		return NULL;
	}

	char* start = str;
	char* end = str + strlen(str) - 1;
	while (start < end)
	{
		char tmp = *start;
		*start = *end;
		*end = tmp;
		start++;
		end--;
	}
	return str;
}
strstr()             //查找子串
原型:char *strstr(const char str1, const char *str2)
功能:查找字符串str2在str1中出现的位置,找到则返回位置,否则返回NULL。

const char* Strstr(const char* str1, const char* str2)
{
	//方法一:一个一个字符来比较,具体的操作需要自己来实现
	/*if (NULL == str1 || NULL == str2)
	{
		return NULL;
	}


	while (*str1)
	{
		if (*str1 == *str2)
		{
			const char* ret = str1;
			const char* tmp_str1 = str1;
			const char* tmp_str2 = str2;
			while (*tmp_str2)
			{
				if (*tmp_str1 != *tmp_str2)
				{
					break;
				}
				tmp_str1++;
				tmp_str2++;
			}
			if (*tmp_str2 == '\0')
			{
				return ret;
			}
		}
		str1++;
	}
	return NULL;*/

	//方法二:使用库函数 strncmp()函数

	if (NULL == str1 || NULL == str2)
	{
		return NULL;
	}

	unsigned len1 = strlen(str1);
	unsigned len2 = strlen(str2);

	while (len1 >= len2)
	{
		if (strncmp(str1, str2, len2) == 0)
		{
			return str1;
		}

		len1--;
		str1++;
	}
	return NULL;
}
以上的都是自己总结的,有什么不足的地方,各位兄弟姐妹烦请指正,感谢!



版权声明:本文为weiaiyisheng_ljj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。