字符函数和字符串函数
一、关于’\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;
}
运行结果,如图所示: