字符函数和字符串函数(一次过)

Posted 雨轩(小宇)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符函数和字符串函数(一次过)相关的知识,希望对你有一定的参考价值。

求字符串的长度

strlen

  1. strlen这个库函数是用来求字符串的长度的
    函数原型:size_t strlen ( const char * str );

注意

  • 字符串已经 ‘\\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\\0’ 前面出-现的字符个数(不包含 ‘\\0’ )。
  • 参数指向的字符串必须要以 ‘\\0’ 结束。
  • 注意函数的返回值为size_t,是无符号的( 易错 )

strlen函数的模拟实现

size_t my_strlen(const char* str)
{
	assert(str != NULL);//断言检查指针是否有效,后面实现其他库函数都是一样的作用
	int len = 0;
	while (*str++ != '\\0')//当指到'\\0',也就是末尾的时候,结束
		len++;
	return len;
}
int main()
{
	char str1[]="hello world!";
	printf("%d", my_strlen(str1));
	return 0;
}

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

strcpy

  1. strcpy是字符串复制函数,将字符串2复制到字符串1
    函数原型:char* strcpy(char * destination, const char * source );

注意

  • 源字符串必须以 ‘\\0’ 结束。
  • 会将源字符串中的 ‘\\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。

strcpy函数的模拟实现

char * my_strcpy(char* dest, const char* str)
{
	//检查指针有效性
	assert(dest != NULL && str != NULL);
	char* s = dest;
	//s指向dest起始的地址
	//*str赋值给*dest,当找到*dest='\\0'的时候,也就是*str为'\\0',赋值给*dest的时候,就停止了
	while ((*dest++ = *str++) != '\\0')
	{
		NULL;
	}
	return s;//循环终止,返回s
}
int main()
{
	char str1[] = "hello world!";//复制过来需要注意接受的数组的容量必须足够大,或者接受不了,不安全
	char str2[] = "xiaobite!";
	printf("%s", my_strcpy(str1, str2));
	printf("\\n%s", str1);
	return 0;
}

strcat

  1. strcat是字符串链接函数,能将字符串2链接在字符串1的后面
    函数原型:char * strcat ( char * destination, const char * source )

注意

  • 源字符串必须以 ‘\\0’ 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • 字符串自己给自己追加,如何?(这个问题库函数模拟实现后再说)

strcat函数的模拟实现

char* my_strcat(char* dest, const char* s)
{
	//str指向的dets的起始地址
	char* str = dest;
	//检查指针是否有效
	assert(dest && s);
	//找到*dest='\\0'的时候停止
	while (*dest)
	{
		dest++;
	}
	//这里再讲*s赋值给*dest,一直找到*s为'\\0'为止,最后返回str
	while (*dest++ = *s++)
	{
		;
	}
	return str;
}
int main()
{
	char s1[20] = "hello ";//这里需要注意容量,一般是字符串,弄到字符串数组中,容量一定要够大
	char* s2 = "bit.";
	my_strcat(s1, s2);
	printf("%s", s1);
	return 0;
}

strcmp

  1. strcmp是字符串比较函数,比较字符串s1和s2,如果第一个字母相等,则比较下一个字母,直到找出谁大谁小,或者找到s1和s2相等。
    函数原型:int strcmp ( const char * str1, const char * str2 );

注意

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

strcmp函数的模拟实现

int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2);//检查指针是否有效
	while (*s1 == *s2)//当*s1和*s2相等的时候,就继续往后走
	{
		//记住看while,因为*s1和*s2相等,才到这个if这里来的,注意一下
		if (*s1 == '\\0')//如果*s1为空,则证明*s1和*s2相等
			return 0;
		s1++;
		s2++;
	}
	//当*s1和*s2不相等的时候,就直接返回他们的差值
	return *s1 - *s2;
}
int main()
{
	char *str1 = "abcde";
	char *str2 = "abcdef";
	int ret = my_strcmp(str1, str2);
	if (ret > 0)
		printf("str1大");
	else if (ret < 0)
		printf("str2大");
	else
		printf("str1与str2相等");
	return 0;
}

长度受限制的字符串函数介绍

strncpy

  1. strncpy作用跟strcpy是一样的,只不过strncpy有长度限制,而strcpy没有长度限制
    函数原型:char * strncpy ( char * destination, const char * source, size_t num );

注意

  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

strncpy函数的模拟实现

char * my_strncpy(char* dest, const char* str,size_t n)
{
	assert(dest != NULL && str != NULL);
	char* s = dest;
	while (n--)
	{
		*dest++ = *str++;
	}
	return s;
}
int main()
{
	char str1[] = "hello world!";
	char str2[] = "xiaobite!";
	printf("%s", my_strncpy(str1, str2, 3));
	printf("\\n%s", str1);
	return 0;
}

strncat

1.strncat作用跟strcat作用一样,但也有长度的限制
函数原型:char * strncat ( char * destination, const char * source, size_t num );

strncat函数的模拟实现

char* my_strncat(char* dest, const char* s,size_t n)
{
	char* str = dest;
	assert(dest && s);
	while (*dest)
	{
		dest++;
	}
	while (n--)
	{
		*dest++ = *s++;
	}
	return str;
}
int main()
{
	char s1[20] = "hello ";
	char* s2 = "bit.";
	my_strncat(s1, s2, 1);
	printf("%s", s1);
	return 0;
}

strncmp

  1. strncmp函数作用同strcmp一样,只不过也有长度限制
    函数原型:int strncmp ( const char * str1, const char * str2, size_t num );

注意

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

strncmp函数的模拟实现

int my_strncmp(const char* s1, const char* s2,size_t n)
{
	assert(s1 && s2);
	while (n--)
	{
		if (*s1 == *s2)
		{
			if (*s1 == '\\0')
				return 0;
			s1++;
			s2++;
		}
	}
	return *s1 - *s2;
}
int main()
{
	char *str1 = "abcde";
	char *str2 = "ebf";
	int ret = my_strncmp(str1, str2,3);
	if (ret > 0)
		printf("str1大");
	else if (ret < 0)
		printf("str2大");
	else
		printf("str1与str2相等");
	return 0;
}

字符串查找

strstr

  1. strstr是在目标字符串查找是否存在该子串,如果存在,则返回目标字符串后面的子串
    函数原型:char * strstr ( const char *, const char * );

strstr函数的模拟实现

char* my_strstr(const char* dest, const char* s)
{
	assert(dest && s);
	const char* str1 = NULL;
	const char* str2 = NULL;
	const char* p = dest;
	//如果s为空字符串,直接返回str1
	if (*s == '\\0')
		return (char*)dest;
	while (*p)
	{
		str1 = p;
		str2 = s;
		while ((*str1 == *str2)&&str1&&str2)
		{
			str1++;
			str2++;
		}
		//如果为子串,则返回主串匹配后面的字符串
		if (*str2 == '\\0')
			return (char*)p;
		p++;
	}
	return NULL;
}
int main()
{
	const char* s1 = "abbbbcde";
	const char* s2 = "bb";
	printf("%s", my_strstr(s1, s2));
	return 0;
}

strtok

错误信息报告

strerror

字符操作

内存操作函数

memcpy

memmove

memset

memcmp

以上是关于字符函数和字符串函数(一次过)的主要内容,如果未能解决你的问题,请参考以下文章

sql数据库截取字符串函数

Python代码阅读(第38篇):根据谓词函数和属性字符串构造判断函数

strtok函数

10个JavaScript代码片段,使你更加容易前端开发。

10个JavaScript代码片段,使你更加容易前端开发。

linux strtock()函数使用问题