求字符串的长度,很多人都会直接想到用strlen函数,只需要头文件string.h就可以很轻松的实现,但对于我们c语言的初学者,也应该尝试用其他方法来进行实现,除了strlen函数外有三种方法可供参考。
1.strlen
#include
#include
int main()
{
char arr[100]={0};
gets(arr);
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
注意头文件string.h即可。
2.计数器方法
int my_strlen(char* str)
{
int count = 0;
while (*str != 'int my_strlen(const char* str)
{
char* temp = str;
assert(str != NULL);//断言保证指针的有效性
while (*str != '')
{
str++;
}
return str-temp;
}
int main()
{
char arr[100];
gets(arr);
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[100];
gets(arr);
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
分析:首先输入字符串,定义指针变量指向首元素地址,'\0'是字符串结束标志,只要指向的数组元素不等于‘0’,就指向下一个数组元素,同时count++,两个变量一个访问元素一个计数,我们还可以进行略微的优化。
优化:
#include
#include //断言的头文件
int my_strlen(const char* str)//const使*str不再改变
{
int count = 0;
assert(str != NULL);//断言保证指针的有效性
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[100];
gets(arr);
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
分析:第一点修改在定义指针变量时我们可以在char前添加一个const,const声明变量后这个变量就不能再改变,const添加有两个位置,一是char* const str,也就是指针常量,二是const char* str,也就是常量指针,这两种效果是截然不同的,第一种是const修饰str,指针常量指向的地址不能改变,但是地址中的数值是可以改变的,可以通过其他指向该地址的指针来改变 ,第二种是修饰*str,不能通过这个指针改变变量的值。
指针指向的值不能改变,但指针本身可以是可以改变指向其他地址的,这里不过多讨论。
因为我们要求字符串的长度,因此肯定不希望字符串的值被改变,所以可以定义常量指针来实现。
第二点修改可以添加一个断言,他的作用是若为真无事发生,若为假则报错,可以保证指针的有效性。
3.指针方法
分析:定义常量指针指向数组arr,此时str指向arr首元素地址,同时定义指针temp也指向arr首元素地址,此时令str逐个访问arr中的元素直到遇到‘\0’结束,两个地址相减得到的即为中间元素个数。
4.函数递归方法
#include
int my_strlen(const char* str)
{
assert(str != NULL);
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[100];
gets(arr);
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
分析:依旧是定义常量指针,在定义的函数中如果*str不等于‘\0’,就执行return 1 + my_strlen(str + 1),第一次执行后返回1,同时继续调用my_strlen函数,令str指向第二个元素,倘若第二个元素依旧不等于'\0',就返回1,指向第三个元素,继续调用函数,直到指向下一个元素为'\0'时终止。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)