c语言——关于不使用strlen求字符串长度

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 在日常生活中,我们有时会遇到这样的题目,不使用strlen函数求字符串长度,关于这种问题,我们其实有很多的方法来解决,首先我们要了解strlen

关于不使用strlen求字符串长度


在日常生活中,我们有时会遇到这样的题目,不使用strlen函数求字符串长度,关于这种问题,我们其实有很多的方法来解决,首先我们要了解strlen


一、strlen函数简介

strlen()是计算字符串的长度,从字符串的首地址开始,'\0’为止,但不包括’\0‘.

int main()
{
char arr[] = "abcdef";//在空间中是abcdef\0
int len = strlen(arr);
printf("%d\n",len);
return 0;
}

二、strlen函数的注意事项

1、strlen函数并不是任何情况都可以使用的

strlen函数并不是任何情况都可以使用的,比如下面这种情况

int main()
{
char arr[] = {'b','i','t'};//在空间中是bit
int len = strlen(arr);
printf("%d\n",len);
return 0;
}

在这种情况下,数组里存储的数据没有’\0’,会导致strlen函数出现随机值,这是由于strlen函数是遇到’\0’才能停下来,没有’\0’是停不下来的

2、strlen函数的返回值也是要注意的一个点

首先我们要看的是strlen函数的返回值类型,如下图

strlen函数的返回值类似是size_t 而size_t在c语言函数编译器里是无符号整形,如下图

根据这个,我们会遇到这样的题目

int main()
{
if (strlen("abd") - strlen("abcdef") > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}

根据上面,我们可以这样理解这个题目,strlen的返回值是无符号整形,所以不可以出现负数,根据这一点,首先我们得出strlen(“abd”)的结果为3,strlen(“abcdef”)的结果为6,3 - 6 = - 3 而系统中不会出现- 3 所以,这个数会转化成 一个很大的数, 所以这题答案是大于

假如在现实生活中出现这种bug,我们可以通过另一种写法来解决

int main()
{
if (strlen("abd") > strlen("abcdef") )
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}

三、不使用strlen求字符串长度

通过前面的这些,我们可以对strlen这个函数有了个简单的了解,现在我们将使用三种方法来解决这个问题

1.计数器方法

size_t my_strlen(const char* str)
{
size_t count = 0 ;
while(*str != '\0')
{
count++;
str++;
}
return count;
}

2.函数递归

size_t my_strlen(const char* str)
{
if(*str != '\0'){
  return 1 + my_strlen(++str);
}
else return 0;
}

3.指针 - 指针

size_t my_strlen(const char* str)
{
  const char* p = str;
  while(*str != '\0'){
    str++;
  }
  return str - p;
}

总结

通过这篇文章,我们可以对strlen函数有了个简单的了解,关于三种方法解决不使用strlen函数求字符串长度,在现实生活中,我们最容易想到的是第一种方法,并且第一种方法是最适用的

相关文章
|
2月前
|
NoSQL 程序员 Redis
C语言字符串的设计缺陷
C语言字符串的设计缺陷
31 1
|
17小时前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
11 4
|
20小时前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
21小时前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
2月前
|
C语言
C语言学习笔记之初识字符串
C语言学习笔记之初识字符串
31 5
|
2月前
|
C语言
c语言左旋字符串问题(不同方法超详细解答)
c语言左旋字符串问题(不同方法超详细解答)
18 1
|
1月前
|
安全 C语言
C语言8 数组与字符串
C语言8 数组与字符串
14 0
|
1月前
|
存储 C语言
C语言6 字符串输入和格式输入函数
C语言6 字符串输入和格式输入函数
24 0
|
2月前
|
安全 C语言 开发者
C语言中的字符串
C语言中的字符串
19 0
|
2月前
|
C语言
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现