字符函数和字符串函数

字符函数和字符串函数

一、关于’\0’
1、’\0’在字符串中表示结束,如果其位置未知,会造成字符串长度为随机值。
2、’\0’==0。其可转义为数字,以下两段语句的运行结果一致。

char ch = '\5';  
char ch1 = 5;

二、字符串长度:strlen
1、从MSDN中,搜索"strlen"的表示为"size_t strlen( const char *string )",加入自己创建的函数名,即

size_t my_strlen( const char *string )

2、由于此函数的参数中含有指针,需要引用断言"assert",插入语句"assert(string != NULL);“即指针不能为空(NULL),检查函数的合法性。
3、此函数的返回值为size_t,其无符号。所以,定义的指针形式应该与其一致。
4、此函数中,我们不需要用原有的函数,则需要对指针进行参数保护,建立一个临时指针"const char *p_str = string;”。
代码如下:

size_t my_strlen(const char *string)
{
   
	assert(string != NULL);
	size_t len = 0;
	const char *p_str = string;

	while (*p_str++ != '\0')
	{
   
		len++;
	}
	return len;
}

5、运用while函数,也可以将"++"加到条件语句"p_str"后
以下两种都可运行,结果一致,代码如下:

while(*p_str++ != '\0')
	{
   
		len++;         
	}
while(*p_str!= '\0')
	{
   
        len++;
		p_str++;
	}

源代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char *string)
{
   
	assert(string != NULL);  
	size_t len = 0;
	const char *p_str = string; 
	while (*p_str++ != '\0')
	{
   
		len++;
	}
	return len;
}
void main()
{
   
	char *str = "xinxin";
	printf("len = %d\n", my_strlen(str));
}

6、如果要求不允许使用第三方变量,即不能使用"len",则需要运用递归。源代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char *string)
{
   
	if (*string == '\0')
		return 0;
	else
		return my_strlen(string + 1) + 1;
}
void main()
{
   
	char *str = "xinxin";
	printf("len = %d\n", my_strlen(str));
}

运行结果如图所示:
在这里插入图片描述三、长度不受限制的字符串函数
1、字符串拷贝函数:strcpy,将str2拷贝到str1中。
1)从MSDN中,搜索"strcpy"的表示为"char *strcpy(char *strDestination, const char *strSource)",加入自己创建的函数名,即

char *my_strcpy(char *strDest, const char*strSrc)

2)在strcpy函数中,str1不能和str2同为指针,字符串不能覆盖原有的常量字符串,这里我们定义str1为数组,创建自己的空间。
代码如下

char str1[] = "Xin0127";
char *str2 = "XZG104";

3)str2中的"\0"也要一并拷贝过去。

*pDest = '\0';

4)返回值为"char *",则之后的访问也可以用对应的指针代替,通过接收返回值的结果得到运行结果。
*入参和出参:形参的修改不影响实参,传地址才能改变实参。
5)依旧需要检查函数的合法性,并且要对参数进行保护,使指针指向的首地址不随函数的执行而变化。代码如下:

char *my_strcpy(char *strDest, const char*strSrc)
{
   
	assert(strDest != NULL&&strSrc != NULL);//检查
	char *pDest = strDest;
	char *pSrc = strSrc;//保护
	while (*pDest != '\0')
	{
   
		*pDest++ = *pSrc++;
	}
	*pDest = '\0';
	return *strDest;
}

6)目标空间(str1)必须足够大且可变,以确保能存放源字符串(str2)。
源代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char *my_strcpy(char *strDest, const char*strSrc)
{
   
	assert(strDest != NULL&&strSrc != NULL);//检查
	char *pDest = strDest;
	char *pSrc = strSrc;//保护
	while (*pDest != '\0')
	{
   
		*pDest++ = *pSrc++;
	}
	*pDest = '\0';
	return *strDest;
}
void main()
{
   
	char str1[] = "Xin0127";
	char *str2 = "XZG104";
	printf("str1=%s\n", str1);
	printf("str2=%s\n", str2);
	char *pret = my_strcpy(str1, str2);
	printf("str1=%s\n", str1);
	return 0;
}

运行结果,如图所示:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值