strlen函数详解

ops/2024/12/22 0:48:34/

目录

strlen函数

注意点

传入的参数必须是指向以\0字符结尾的字符串

strlen()的返回值是无符号整型

模拟实现

1.计数器的方式

2.递归的方式

3.指针相减

strlen函数和sizeof的区别


strlen函数

strlen函数是C语言中的一个字符串函数,用于计算一个字符串的长度。 它的原型如下:

size_t strlen(const char *str);

其中,参数str是一个指向以\0字符结尾的字符串的指针,函数返回值是一个无符号整型(size_t),表示字符串的长度。

函数的功能是遍历字符串,直到遇到\0字符,然后返回所遍历的字符(包括空格)数(不包括\0字符)。

示例代码:

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello World";int len = strlen(str);printf("Length of string: %d\n", len);return 0;
}

输出结果:

Length of string: 11

上述代码中,我们首先声明一个字符数组str并使用字符串常量进行初始化。然后,使用strlen函数计算字符串的长度,并将结果打印输出。

注意点

传入的参数必须是指向以\0字符结尾的字符串

我们先来看个例子

#include <stdio.h>
#include <string.h>
int main()
{char arr[10] = "abcde";int num = strlen(arr);printf("数组arr的长度为:%d\n", num);return 0;
}

结果是 

数组arr的长度为:5

我们再看看 

#include <stdio.h>
#include <string.h>int main()
{char arr[] = { 'a','b','c','d','e' };int num = strlen(arr);printf("数组arr的长度:%d\n", num);return 0;
}

结果是

数组arr的长度:74

 我们惊奇的发现,这两次的结果怎么不一样呢?原来是strlen()只以\0为结尾标志,所以传入的参数必须是指向以\0字符结尾的字符串,否则会返回随机值

strlen()的返回值是无符号整型

此外

strlen("abc")-strlen("abcdef")

这是不可取的,因为strlen()的返回值是无符号整型,是正整数,上面这就相当于3-5,会出现负数,这是不允许的 

模拟实现

1.计数器的方式

#include<stdio.h>
#include<assert.h>
size_t my_strlen1(const char* a)
{assert(a);size_t count=0;while (*a != '\0'){count++;a++;}return count;
}int main()
{char arr1[] = "abcdefg";size_t num1 = my_strlen1(arr1);printf("字符串arr1的长度为:%zd\n", num1);
}

2.递归的方式

#include<stdio.h>
#include<assert.h>size_t my_strlen2(const char* a)
{assert(a);if (*a == '\0'){return 0;}else{return 1 + my_strlen2(++a);}
}int main()
{char arr1[] = "abcdefg";size_t num1 = my_strlen2(arr1);printf("字符串arr1的长度为:%zd\n", num1);
}

3.指针相减

#include<stdio.h>
#include<assert.h>size_t my_strlen3(const char* a)
{assert(a);char* start = a;while (*a != '\0'){a++;}return a - start;
}int main()
{char arr1[] = "abcdefg";size_t num1 = my_strlen3(arr1);printf("字符串arr1的长度为:%zd\n", num1);
}

strlen函数和sizeof的区别

sizeof 和 strlen 在 C 语言中都是用于测量数据大小的函数,但它们在操作的对象、测量的方式以及返回的结果等方面有显著的不同。

  1. 操作对象:

    • sizeof 是一个运算符,它返回的是其操作数在内存中的大小(以字节为单位)。这个操作数可以是一个类型、一个对象或者一个表达式。例如,sizeof(int)sizeof(array) 或 sizeof(struct MyStruct) 都是有效的。
    • strlen 是一个函数,它返回的是字符串的长度(不包括结尾的空字符 '\0')。这个函数只接受一个参数,即一个指向以空字符 '\0' 结尾的字符数组的指针(通常我们称之为 C 字符串)。
  2. 测量方式:

    • sizeof 在编译时计算其操作数的大小。它直接获取类型或对象在内存中的大小,而不需要访问实际的内存内容。
    • strlen 在运行时计算字符串的长度。它通过遍历字符串,直到遇到空字符 '\0' 为止,来计算字符串的长度。
  3. 返回值:

    • sizeof 返回的是一个无符号整数类型 size_t,表示的是字节数。
    • strlen 返回的也是一个无符号整数类型 size_t,表示的是字符数(不包括结尾的空字符)。
  4. 处理空指针:

    • 当你对一个空指针使用 sizeof 时,它返回的是指针类型的大小,而不是零。例如,在 32 位系统上,sizeof(NULL) 通常返回 4(因为指针的大小是 4 字节)。
    • 当你对一个空指针使用 strlen 时,结果是未定义的(通常会导致程序崩溃,因为 strlen 会尝试读取指针指向的内存)。
  5. 处理数组:

    • 当 sizeof 作用于一个数组时,它返回的是整个数组的大小(字节数)。
    • strlen 只能用于处理以空字符 '\0' 结尾的字符数组(即 C 字符串)。如果直接对一个非字符串的字符数组使用 strlen,结果将是未定义的,因为 strlen 会继续读取内存直到遇到空字符为止。

总的来说,sizeof 和 strlen 在功能和使用上有显著的区别。你需要根据你的具体需求来选择合适的函数。

下面是一个使用 C 语言来展示 sizeof 和 strlen 区别的例子:

 #include <stdio.h>  #include <string.h>  int main() {  char str[] = "Hello, World!";  char *ptr = str;  // 使用 sizeof 获取数组 str 的大小(包括所有字符和结束符 '\0')  size_t sizeof_str = sizeof(str);  printf("Size of str (including null terminator): %zu bytes\n", sizeof_str);  // 使用 strlen 获取字符串 str 的长度(不包括结束符 '\0')  size_t strlen_str = strlen(str);  printf("Length of str (excluding null terminator): %zu characters\n", strlen_str);  // 使用 sizeof 获取指针 ptr 的大小(不是它指向的内容的大小)  size_t sizeof_ptr = sizeof(ptr);  printf("Size of ptr (pointer size): %zu bytes\n", sizeof_ptr);  // 注意:不能直接对 NULL 指针使用 strlen,因为这会导致未定义行为  // 但可以对 NULL 指针使用 sizeof  char *null_ptr = NULL;  size_t sizeof_null_ptr = sizeof(null_ptr);  printf("Size of null_ptr (pointer size): %zu bytes\n", sizeof_null_ptr);  // strlen(null_ptr); // 这行会导致程序崩溃或未定义行为,不要这样做  return 0;  } 

在这个例子中,我们定义了一个字符数组 str 和一个指向这个数组的指针 ptr。我们使用 sizeof 来获取 str 数组在内存中的大小(包括所有字符和结尾的空字符 '\0'),以及 ptr 指针的大小(这通常取决于你的系统是 32 位还是 64 位)。对于 str 数组,我们还使用 strlen 来获取字符串的长度,即不包括结尾的空字符 '\0' 的字符数。

注意,sizeof 运算符返回的是数组的总大小(以字节为单位),而 strlen 函数返回的是字符串的长度(以字符为单位,不包括结束符)。对于指针 ptr,sizeof 返回的是指针变量本身的大小,而不是它所指向的字符串的大小。

最后,我们尝试对一个 NULL 指针 null_ptr 使用 sizeof,这是安全的,并且返回的是指针类型的大小。但是,我们注释掉了对 null_ptr 使用 strlen 的尝试,因为这会导致未定义行为(通常是程序崩溃)。


http://www.ppmy.cn/ops/23983.html

相关文章

Java表达式求值(前缀、中缀、后缀)

表达式求值需要利用栈进行计算 前缀表达式&#xff1a; 又称波兰表达式&#xff0c;由右向左遍历表达式&#xff0c;遇到数字就压入栈&#xff0c;遇到运算符就连续弹出两个栈顶元素&#xff0c;用【第一个栈顶元素&#xff0c;运算符&#xff0c;第二个栈顶元素】计算新值压入…

Hive第一篇简介

Hive简介 1. 数据仓库1.1. 基本概念1.2. 主要特征1.2.1. 面向主题1.2.2. 集成性1.2.3. 非易失性1.2.4. 时变性 1.3. 数据库与数据仓库的区别1.4. 数仓的分层架构为什么要对数据仓库分层&#xff1f; 1.5. 数仓的元数据管理 2. Hive 的基本概念2.1. Hive 简介什么是 Hive为什么使…

如何有效的将丢失的mfc140u.dll修复,几种mfc140u.dll丢失的解决方法

当你在运行某个程序或应用程序时&#xff0c;突然遭遇到mfc140u.dll丢失的错误提示&#xff0c;这可能会对你的电脑运行产生一些不利影响。但是&#xff0c;不要担心&#xff0c;以下是一套详细的mfc140u.dll丢失的解决方法。 mfc140u.dll缺失问题的详细解决步骤 步骤1&#x…

[NSSRound#23 misc] 前两题

这个周末NSS个人赛是个MISC&#xff0c;这个好久没怎么玩了&#xff0c;结果不会了。只作出一题来&#xff0c;不过参与的人比较少&#xff0c;每题解出数和也不到50。前50吧:) 画师 给了一个xml文件&#xff0c;看内容有 mxGraphModel 标签&#xff0c;应该是某个东西画的矢…

7-云原生监控体系-PromQL-函数功能和示例

Prometheus支持几个函数来操作数据。 文章目录 1. 函数语法解释2. count(v instant-vector)3. topk(n, v instant-vector)4. bottomk(n, v instant-vector)5. increase(v range-vector)6. rate(v range-vector)7. rate 和 increase8. irate(v range-vector)9. predict_linear(…

安卓开发Webview RTC 适配

一、场景 在混合开发方式中&#xff0c;项目前端使用了tracking.js 开发了一个人脸识别功能&#xff0c;但是在安卓端无法成功调用摄像头进行视频捕获&#xff0c;在浏览器中可以正常使用该功能。 二、问题分析 之前的音视频文件适配提供给前端的方式&#xff0c;都是通过inp…

ICCV2023人脸识别TransFace论文及代码学习笔记

论文链接&#xff1a;https://arxiv.org/pdf/2308.10133.pdf 代码链接&#xff1a;GitHub - DanJun6737/TransFace: Code of TransFace 背景 尽管ViTs在多种视觉任务中展示了强大的表示能力&#xff0c;但作者发现&#xff0c;当应用于具有极大数据集的人脸识别场景时&#…

ElasticSearch复合查寻

FunctionScore主要是在原始查询的基础上去修改一下算分的。 而BooleanQuery布尔查询&#xff0c;它不会去修改算分&#xff0c;而是把多个查询语句组合在一起形成新查询。这些被组合的查询语句&#xff0c;我们都称之为叫子查询了&#xff0c;这些子查询&#xff0c;它的组合方…