【C库函数】strlen函数详解

简介: 获得字符串的长度(string length)

strlen

获得字符串的长度(string length)

0c00bb2a839e2b2ce5eaaab8b54be3bd_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

函数基本原型

size_t strlen( const char *string );


参数解读

参数 string
解释 要获取字符串长度的地址

返回值详解

       返回的是size_t类型的值,size_t是无符号整数,这里要注意如果用返回值进行减法运算的话可能会出错


以下列代码为例,大家猜猜结果是啥

#include<stdio.h>
#include<string.h>
int main()
{
  char str1[] = "Hello";
  char str2[] = "Bit";
  if (strlen(str2) - strlen(str1) >= 0)
  {
  printf("str2 > str1");
  }
  else {
  printf("str2 < str1");
  }
  return 0;
}

很明显str1中字符串的长度比str2中的字符串长,大家可能感觉结果是打印"str2 < str1",但是实际上结果恰恰相反

efcc8eba99552c726a1a9bbadeaaaf9e_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

为什么是打印"str2 > str1",别急且听我慢慢讲解。


我们先看strlen(str2)和strlen(str1)的值,分别是3和5。而3-5=(-2)是个整数呀,为什么会大于零呢?这就要讨论strlen(str2)和strlen(str1),因为strlen返回值是无符号整数,所以(3)和(5)也是无符号的,所以(3-5)也是无符号整数。


大家估计都知道有符号正整数在计算机存储是原码(下面都是以二进制代码为例)


       3的原码:00000000000000000000000000000011


       5的原码:00000000000000000000000000000101


有符号负整数在计算机内存储的是补码


       -2的原码:10000000000000000000000000000010


       -2的反码:11111111111111111111111111111101(原码取反)


       -2的补码:11111111111111111111111111111110(反码加1)


第一位为符号位,当一个数存储在计算机内时,计算机都会检测第一位判断这个数是否为正整数或是负整数,而无符数计算机则不判断直接进行转换。


如下,(-2)打印出来是4294967294,是一个超级大的数。

df5c6cb71599f81cd67697ffba2a0092_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

这也是为啥例题能打印出"str2 > str1"的原因。


函数用法详解

        见到strlen函数我们可能会想,它是怎么求字符串长度的呢?


       当我们给出一个字符串"abcdef"时,这个字符串末尾其实隐藏一个‘\0’做结束标志。


       "abcdef"={' a ',' b ',' c ',' d ',' e ',' f ',' \0 '}


       而strlen()函数找到字符串的其实位置一直往后找,一直找到‘\0’为止。


       专业也是strlen函数一个基本工作原理

1871dd7f07e59a2cf2d708a1512551e3_b66eeb9b6f38443c84d0aaac66e8d43f.gif

#include<stdio.h>
#include<string.h>
int main()
{
    char str[] = "abcdef";
    printf("%d", strlen(str));
    return 0;
}
 还有一种情况,没有‘\0’时,如下。
#include<stdio.h>
#include<string.h>
int main()
{
    char str[] = { 'a','b','c','d','e','f' };
    printf("%d", strlen(str));
    return 0;
}

bc5e1315623e59915524cead92d36bb1_44e1aead5d0c48e7a1a7e1d895541849.png

还有一种情况,没有‘\0’时,如下。

#include<stdio.h>
#include<string.h>
int main()
{
    char str[] = { 'a','b','c','d','e','f' };
    printf("%d", strlen(str));
    return 0;

这里打印的是19,为什么是19呢?abcdef是放到数组str里面的,数组只申请6个空间。而strlen也是倔脾气,只找到‘\0’才返回值,而在‘\0’之前可能出现19非'\0'的字符。所以才打印了19。这个19是个随机值,我们也不知道下次'\0'之前有多少多字符。

所以,让strlen求字符串时,参数所指向的字符串必须以‘\0’结束。

当我们自己放入一个‘\0’时,就会打印正常值了。

ef2c8daf6cf3b50f5de666e4cda52313_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

当然,当指定数组大于6,也是可以的

5297b534d5cbd420a273269545edaa43_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

当把abcdef放到str[10]中时,只初始化前6个空间,而后四个空间编号一起会默认初始化为'\0'。

5988d24ae666817070a5636ab5438ec2_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

希望大家能够注意以上几点。


相关文章
|
2月前
|
安全 程序员 C语言
探索C语言库函数:字符串拷贝函数strcpy
探索C语言库函数:字符串拷贝函数strcpy
21 0
|
17天前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
5月前
模拟实现库函数strlen
模拟实现库函数strlen
15 0
|
10月前
|
C语言
strcat函数和strncat函数--【C语言】
strcat函数和strncat函数--【C语言】
|
10月前
|
程序员 C语言
C语言实现strcpy函数和strlen函数
在操作字符串的函数大块中,其中有两个函数分别是strcpy和strlen函数,他们都是在#include<string.h>中包含。strcpy函数可以将一个字符数组的内容放到另一个字符数组中,实现字符串拷贝,而strlen函数是求一组字符串的长度的函数。他们都由C库提供,方便程序员使用。
62 0
|
10月前
|
C语言
strcmp函数和strncmp函数【C语言】
strcmp函数和strncmp函数【C语言】
|
11月前
|
编译器 C语言
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
103 0
|
C语言
c语言 字符串操作函数 strcpy, strcat, strcmp, strlen.
字符串操作函数是用于操作字符串的。有的函数有新版和旧版,大同小异。字符串操作函数的头文件: string.h
80 0
|
安全 编译器
【C库函数】strncpy函数详解
【C库函数】strncpy函数详解
【C库函数】strncpy函数详解