下面介绍几个常见的字符串函数的使用并且学会自己创建实现与它们一样的功能,借此来巩固与字符串、函数、指针相关方面的知识。
strlen函数(头文件是<string.h>)
由此可见:
·strlen函数的返回值是返回值是size_t,是无符号的(在使用函数返回值进行加减运算判断两个字符串长度时容易发生错误)
·函数的形参是指向char的指针,由于只用来计算而不改变字符串内容,因此使用const
·使用指针在访问字符串内容时,访问到'\0'就停止,因此计算的长度是\0以前,不包括\0
strlen的使用方法举例:
#include<stdio.h>
#include<string.h>
int main()
{
const char arr1[] = "abcdef";
const char arr2[] = "abc";
size_t len1 = strlen(arr1);
size_t len2 = strlen(arr2);
printf("arr1的长度为:%d\narr2的长度为:%d", len1, len2);
return 0;
}
使用strlen函数判断两个字符串长度大小
#include<stdio.h>
#include<string.h>
int main()
{
const char* arr1 = "ab";
const char* arr2 = "abc";
if(strlen(arr1) - strlen(arr2) > 0)
printf("arr1的字符串长度大于arr2\n");
else if(strlen(arr1) - strlen(arr2) < 0)
printf("arr1的字符串长度小于arr2\n");
else
printf("相等");
return 0;
}
显而易见,在程序中arr1的字符串长度要小于arr2的,但是我们来看下程序运行结果:
还记得我上面说的它的返回值是size_t,无符号整形,就算结果是时-1,他也会转化为1
但是我们可以对他的返回值进行强制类型转换,借此达到目的:
if((int)strlen(arr1) - (int)strlen(arr2) > 0)
printf("arr1的字符串长度大于arr2\n");
else if((int)strlen(arr1) - (int)strlen(arr2) < 0)
printf("arr1的字符串长度小于arr2\n");
else
printf("相等");
strlen的几种不同模拟的实现方法
计数器方式
#include<stdio.h>
#include<string.h>
int my_strlen(const char* str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}
int main()
{
const char* arr = "abcdef";
int len = my_strlen(arr);
printf("字符串的长度为%d", len);
return 0;
}
不能创建临时变量的方式
#include<stdio.h>
#include<string.h>
int my_strlen(const char* str)
{
if(*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
int main()
{
const char* arr = "abcdef";
int len = my_strlen(arr);
printf("字符串的长度为%d", len);
return 0;
}
此处采用函数递归调用的方式,即先进行递推直到结束调用,后进行回归,计算每次递推调用的返回值,没学到也不要紧,简单理解一下
指针——指针的方式
#include<stdio.h>
#include<string.h>
int my_strlen(const char* str)
{
const char *p = str;
while(*str != '\0')
{
str++;
}
return str - p;
}
int main()
{
const char* arr = "abcdef";
int len = my_strlen(arr);
printf("字符串的长度为%d", len);
return 0;
}
这种方式是利用指针减去指针得到的是两指针间的元素个数
有一点需要注意,我们要把str的地址先传给另一个指针,因为再进行str++时,此时指针已指向字符串str的‘\0’处