【C语言】字符函数和字符串函数


一、字符串函数

   在使用字符串库函数时,要引头文件#include <string.h>

1.strlen

size_t strlen( const char *string );

   strlen在求字符串长度时,以’\0’作为结束标志,返回字符串中’\0’之前出现的字符个数。同时,strlen函数的返回类型为size_t,是无符号的。

//模拟实现strlen
//1.计数
#include <assert.h>
int my_strlen1(const char* s)
{
	assert(s);

	int count = 0;
	while (*s++)
		count++;
	return count;
}
//2.递归
int my_strlen2(const char* s)
{
	assert(s);

	if (*s)
		return 1 + my_strlen2(s + 1);
	else
		return 0;
}
//3.指针减指针
int my_strlen3(const char* s)
{
	assert(s);

	char* tmp = s;
	while (*tmp++)
		;
	return tmp - s - 1;
}

2.strcpy

char *strcpy( char *strDestination, const char *strSource );

   strcpy拷贝源字符串到目的字符串,直到将源字符串中的‘\0’拷贝到目的字符串之后停止。所以目的字符串的空间必须足够大,源字符串必须以‘\0’停止。

#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);

	char* tmp = dest;
	while (*dest++ = *src++)
		;
	return tmp;
}

3.strcat

char *strcat( char *strDestination, const char *strSource );

   strcat在目标字符串后追加一个字符串,目的字符串的空间必须足够大,源字符串必须以‘\0’停止。

#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);

	char* tmp = dest;
	while (*dest++)
		;
	dest--;
	while (*dest++ = *src++)
		;
	return tmp;
}

4.strcmp

int strcmp( const char *string1, const char *string2 );

   strcmp用来比较两个字符串,如果第一个字符串大于第二个字符串,返回大于0的数字;如果第一个字符串等于第二个字符串,返回0;如果第一个字符串小于第二个字符串,返回小于0的数。

#include <assert.h>
int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s2 == '\0')
			return 0;
		s1++;
		s2++;
	}
	return *s1 - *s2;
}

5.strncpy

char *strncpy( char *strDest, const char *strSource, size_t count );

   strncpy从源字符串拷贝n个字符到目标字符串,如果源字符串的长度小于n,则拷贝完源字符串之后,在目标的后面追加0,直到n个。

#include <assert.h>
char* strncpy(char* dest, const char* src, size_t n)
{
	assert(dest && src);

	char* tmp = dest;
	while (n--)
	{
		*dest = *src;
		dest++;
		if (*src != '\0')//如果没有拷贝完源字符串
			src++;
	}
	return tmp;
}

6.strncat

char *strncat( char *strDest, const char *strSource, size_t count );

   strncat在目标字符串后追加n个字符,如果超出源字符串的长度,则只追加一个源字符串。strncat会在追加字符串的末尾放一个‘\0’。

char* my_strncat(char* dest, const char* src, size_t num)
{
	assert(dest && src);

	char* tmp = dest;
	int len = strlen(src);
	while (*dest++)
		;
	dest--;
	int k = len < num ? len : num;
	while (k--)
	{
		*dest++ = *src++;
	}
	*dest = '\0';
	return tmp;
}

7.strncmp

int strncmp( const char *string1, const char *string2, size_t count );

   strncmp比较两个字符串在n个字节里的关系。

#include <assert.h>
int my_strncmp(const char* dest, const char* src, size_t num)
{
	assert(dest && src);

	int k = 0;
	while (*dest++ == *src++)
	{
		k++;
		if (k == num)
			return 0;
	}
	return *--dest - *--src;
}

8.strstr

char *strstr( const char *string, const char *strCharSet );

   strstr判断第二个字符串是不是第一个字符串的子串,如果是,返回第一个字符串中找到子串的地址,找不到返回NULL。

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

二、字符函数

   在使用字符库函数时,要引头文件#include <ctype.h>

常见的字符函数:
  isspace :空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
  isdigit :十进制数字 0~9
  isxdigit :十六进制数字,包括所有十进制数字,小写字母a-f,大写字母A-F
  islower : 小写字母a~z
  isupper :大写字母A~Z
  isalnum :字母或者数字,a-z,A-Z,0~9
  tolower :大写字母转小写
  toupper :小写字母转大写

   以上函数在调用时,如果表达式判断为真,返回一个非0的值,如果为假,返回0。

三、内存函数

   在使用内存函数时,要引头文件#include <string.h>

1.memcpy

void *memcpy( void *dest, const void *src, size_t count );

   memcpy从src的位置向后复制count个字节到dest,如果dest和src有任何的重叠,复制的结果时未定义的,所以在赋值有重叠部分的时候,应使用memmove。

#include <assert.h>
void my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);

	char* d = (char*)dest;
	char* s = (char*)src;
	while (num--)
	{
		*d++ = *s++;
	}

	return dest;
}

2.memmove

void *memmove( void *dest, const void *src, size_t count );

   如果dest和src有任何的重叠,就应该使用memmove处理。

#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);

	char* d = (char*)dest;
	char* s = (char*)src;
	if (d < s)
	{
		while (num--)
			*d++ = *s++;
	}
	else
	{
		while (num--)
			*(d + num) = *(s + num);
	}
	return dest;
}

3.memcmp

int memcmp( const void *buf1, const void *buf2, size_t count );

   比较从buf1 和 buf2 开始的count 个字节,返回值同strcmp。

int my_memcmp(const void* e1, const void* e2, size_t num)
{
	assert(e1 && e2);

	char* a1 = (char*)e1;
	char* a2 = (char*)e2;
	int k = 0;
	while (*a1++ == *a2++)
	{
		k++;
		if (k == num)
			return 0;
	}
	return *--a1 - *--a2;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LRBORRR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值