深度解析C语言字符串与字符串函数

求字符串长度

strlen

size_t strlen( const char *string );

该函数用于计算一个字符串的长度,接收字符指针,返回字符串长度的无符号整型。

该函数原理是在字符串中查找'\0',会读取字符串的内容。

注意:

1、参数指向的字符串必须以'\0'结尾。

2、返回的类型是无符号整型,且是'\0'之前的元素个数。

int main()
{
	char arr[] = "abcde";
	printf("%d", strlen(arr));
	SYS;
	R0;
}
// 这段代码中返回的是5
int main()
{
	char a1[] = "abcd";
	char a2[] = "abcdef";
	if (strlen(a1) - strlen(a2) > 0)
	{
		printf("str1>str2\n");
	}
	else
	{
		printf("str1<str2\n");
	}
	SYS;
	R0;
}

这段代码中,str1的元素个数为4,str2的元素个数为6,4-6=-2,但代码执行结果为str1>str2,是因为strlen返回的是无符号整型 。

unsigned 4- unsigned 6=unsigned 4294967294。

模拟实现

strlen模拟实现一般有三种方法

1、计数器

size_t my_strlen(const char* str)
{
	int count = 0;
	while (*str != 0)
	{
		str++;
		count++;
	}
	return count;
}

int main()
{
	char a[] = "abcdef";
	printf("%d", my_strlen(a));
	SYS;
	R0;
}

2、递归

size_t my_strlen(const char* str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return my_strlen(str + 1) + 1;
	}
}

int main()
{
	char a[] = "abcdef";
	printf("%d", my_strlen(a));
	SYS;
	R0;
}

3、指针

size_t my_strlen(const char* str)
{
	char *end = str;
	while (*end)
	{
		end++;
	};
	return end - str;

}

int main()
{
	char a[] = "abcdef";
	printf("%d", my_strlen(a));
	SYS;
	R0;
}

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

strcpy

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

该函数字符串复制函数,需要一个源字符串与一个目标字符串作为参数,返回目标字符串的首地址。

注意:

1、该函数的源字符串和目标字符串都必须以'\0'结尾。

2、该函数目标字符串空间必须大于等于源字符串空间,如果小于,那么该函数也会进行复制,造成数组越界。

3、该函数的目标空间必须可变。

模拟实现

char *my_strcpy(char *b, const char *a)
{
	char *ret = b;
	while (*b++ = *a++);
	return ret;
}

int main()
{
	char a[] = "abcdefg";
	char b[50];
	my_strcpy(b, a);
	printf("%s", b);
	SYS;
	R0;
}

strcat

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

该函数将两个字符串拼接在一起,并返回目标字符串。

注意:

1、目标字符串必须够大。

2、源字符串必须以'\0'结尾,因为该函数会不断向后,直到找到'\0'。

3、目标空间可修改。

4、该字符串不可给自己追加,该函数要找到目标的'\0'字符处进行追加,自己给自己追加会丢失'\0'字符。

模拟实现

char * my_strcat(char *b, const char *a)
{
	char *ret = b;
	while (*b)
	{
		b++;
	}
	while (*b++ = *a++);
	return ret;
}


int main()
{
	char a[] = "abcdefg";
	char b[50] = "XXXX";
	my_strcat(b,a);
	printf("%s\n", b);
	SYS;
	R0;
}

strcmp

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

通过比较两个字符串中字符的大小,判断字符串的大小,当str1>str2时返回大于0的数,当str1=str2时返回0,当str1<str2时返回小于0的数。

模拟实现

int my_strcmp(const char* b, const char *a)
{
	while (*b - *a == 0 && *b&&*a)
	{
		b++;
		a++;
	}
	return *b - *a;
}


int main()
{
	char a[] = "abcde";
	char b[] = "abcdef";
	int ret = my_strcmp(b, a);
	if (ret > 0)
	{
		printf("b>a");
	}
	else if (ret < 0)
	{
		printf("b<a");
	}
	else
	{
		printf("b=a");
	}
	SYS;
	R0;
}

长度受限制的字符串函数

strncpy

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

模拟实现

strncat

模拟实现

strncmp

模拟实现

字符串查找

strstr

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

该函数在字符串中查找一个子串。

模拟实现

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

int main()
{
	char a[] = "abbbcdef";
	char b[] = "bbcd";
	char *p;
	p=my_strstr(a,b);
	printf("%s", p);
	SYS;
	R0;
}

strtok

模拟实现

错误信息报告

strerror

模拟实现

字符操作

相关字符函数

内存操作函数

memcpy

模拟实现

void * my_memcpy(void* b, void *a, size_t num)
{
	void * ret = b;
	while (num--)
	{
		*(char *)b = *(char *)a;
		(char *)b+=1;
		(char *)a+=1;
	}
	return ret;
}

int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int b[30];
	my_memcpy(b, a, sizeof(a));
	for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
	{
		printf("%d ", b[i]);
	}
	SYS;
	R0;
}

memmove

模拟实现

void *my_memmov(void * dst, void *src, size_t num)
{
	void * ret = dst;
	int i = 0;
	if ((char *)dst >= (char *)src)
	{
		i = num - 1;
		while (i>=0)
		{
			*((char*)dst+i) = *((char*)src+i);
			i--;

		}
	}
	else
	{
		i = 0;
		while (i < num)
		{
			*((char*)dst + i) = *((char*)src + i);
			i++;
		}
	}
	return ret;
}

int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	my_memmov(a-2, a, 5 * sizeof(int));
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("%d ", a[i]);
	}
	SYS;
	R0;
}

memset

模拟实现

memcmp

模拟实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值