上一节中,我们认识了一些字符串处理函数,这些字符串处理函数均为系统自带的函数。包含上头文件string.h
之后均可使用。
这一节中,我们将运用指针尝试自己实现这些字符串处理函数。以增强我们对指针和字符串的认识。为了区别系统库的字符串处理函数,我们自己的字符串处理函数将添加前缀m。
1. 获取字符串长度strlen
strlen
的函数原型:
size_t strlen(const char *str);
输入:一个指向字符串首地址的指针。
输出:size_t
类型的整型,用于表示字符串长度。
功能:strlen
函数可以获取字符数组中的字符串长度。它从第一个字符开始计数,直到遇到'\0'
为止,并返回累计的长度。
现在我们模仿strlen
函数,写一个功能一模一样的mstrlen
函数。
size_t mstrlen(const char *str)
{
...
}
为了函数的安全性,强烈建议在函数开始时检查输入参数的有效性。对于指针,检查它是不是一个空指针。
size_t mstrlen(const char *str)
{
// 如果传入了空,那么直接返回0。
if (str == NULL)
{
return 0;
}
...
}
接下来,我们设置一个计数变量len
,初始值为0,表明初始长度为0。接着,我们将遍历str
字符串,直到str
所指向的字符为'\0'为止,每经过一个字符,len
加1。
size_t mstrlen(const char *str)
{
...
// 长度从0开始累计
size_t len = 0;
// 计算长度
while(*str != '\0')
{
len++; // 当前字符不为'\0',计数器加1
str++; // str指向下一个字符
}
return len;
}
完整代码如下:
size_t mstrlen (const char *str)
{
// 如果传入了空,那么直接返回0。
if (str == NULL)
{
return 0;
}
// 长度从0开始累计
size_t len = 0;
// 计算长度
while(*str != '\0')
{
len++; // 当前字符不为'\0',计数器加1
str++; // str指向下一个字符
}
return len;
}
我们使用下面的代码来测试mstrlen
函数是否正确。
int main()
{
size_t len;
// 空指针为输入
len = mstrlen(NULL);
printf("%d\n", len);
// 空字符串输入
len = mstrlen("");
printf("%d\n", len);
// 字符串Hello输入
len = mstrlen("Hello");
printf("%d\n", len);
return 0;
}
在做测试时,一定要注意一些异常和边界条件。比如NULL作为输入,空字符串""作为输入。函数必须可以很好地处理这些异常和边界条件才算一个好的实现。