C语言中关于计算字符串长度的几种方式

 更新时间:2022年08月19日 09:01:50   作者:笋干zzZ~  
这篇文章主要介绍了C语言中关于计算字符串长度的几种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

计算字符串长度的几种方式

C语言计算字符串长度,可以手动计算也可以使用库函数或者sizeof()操作符。

  • 自定义函数求长度
  • 使用strlen()函数
  • 使用sizeof()操作符

自定义函数

int cont_str(char *s)
{
    int i = 0;      
    while ( str[i++] != '\0');
    return --i;
}

使用string头文件中的strlen()函数

strlen(str); //假设str为待求的字符串数组名

使用sizeof()操作符

int len=sizeof(str)/sizeof(str[0])-1; //假设str为待求的字符串数组名

注意:

  • strlen()函数求出的字符串长度为有效长度,既不包含字符串末尾结束符 ‘\0’;
  • sizeof()操作符求出的长度包含字符串末尾的结束符 ‘\0’;

当在函数内部使用sizeof()求解由函数的形参传入的字符数组的长度时,得到的结果为指针的长度,既对应变量的字节数,而不是字符串的长度,此处一定要小心。(当数组或者字符串(可以理解为数组)作为函数参数是,是会当做指针来使用,指针的长度由编译器决定,大多数为4个byte. )

例如:

void strlen(char* str)
{
     int length;
     length = sizeof(str)/sizeof(str[0]);  //str为4个字节,str[0] = 1  
}

计算字符串长度,使用sizeof和strlen的坑

最近刷leetcode,遇到很多字符串处理的问题,经常需要用到统计一下字符串长度,踩了很多坑,分享一下。

使用strlen计算

1.引用<string.h>

2.声明字符串时,如果同时初始化,需要有充足的空间,留有存储‘\0’的空间。

解释一下就是:

例如:

char str[]="12345";//声明,同时初始化

此时字符串中实际存储为“12345\0”,此时strlen(str)遇到‘\0’,停止基数,返回数组长度5;

若char str[5]="12345",此时字符串中实际存储为“12345”,没有额外空间存储‘\0’,strlen(str)返回的是一个无意义的随机值(我觉得是这样),也就是说,如果定义的字符串长度<实际的字符串长度+1,strlen函数就没有意义,无法使用

相反的,若定义的字符串长度>=实际的字符串长度+1,则结果正确。

使用sizeof计算

1.sizeof(str),这里str必须为字符数组名,如果传入的是一个char指针(不含*),则返回的是指针类型的宽度一定为4

假设定义字符串char *str,区分:sizeof(*str)等价于sizeof(char)返回1,sizeof(str)等价于sizeof(char *)返回4,均没有办法活动字符串长度。

2.sizeof返回的是该字符串占用内存的大小。

char str[20]="12345";sizeof(str)返回20;
char str[2]="12345",sizeof(str)返回2;
char str[]="12345",sizeof(str)返回6,此时包含隐含的‘\0'字符;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • c语言版本二叉树基本操作示例(先序 递归 非递归)

    c语言版本二叉树基本操作示例(先序 递归 非递归)

    这篇文章主要介绍了实现二叉树的创建(先序)、递归及非递归的先、中、后序遍历
    2013-11-11
  • C++之CNoTrackObject类和new delete操作符的重载实例

    C++之CNoTrackObject类和new delete操作符的重载实例

    这篇文章主要介绍了C++之CNoTrackObject类和new delete操作符的重载实例,是C++程序设计中比较重要的概念,需要的朋友可以参考下
    2014-10-10
  • VSCode搭建STM32开发环境的方法步骤

    VSCode搭建STM32开发环境的方法步骤

    当我们的工程文件比较大的时候,编译一次代码需要很久可能会花费到四五分钟,但是我们用vscode编写和编译的话时间就会大大缩减,本文就介绍一下VSCode搭建STM32开发环境,感兴趣的可以了解一下
    2021-07-07
  • C语言 socketpair用法案例讲解

    C语言 socketpair用法案例讲解

    这篇文章主要介绍了C语言 socketpair用法案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析

    C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析

    这篇文章主要介绍了C++实现图的邻接矩阵存储和广度、深度优先遍历,实例分析了C++实现图的遍历技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C语言进制转换代码分享

    C语言进制转换代码分享

    本文给大家分享的是使用C语言实现进制转换的代码,十分的简单实用,有需要的小伙伴可以参考下。
    2015-07-07
  • C++实现LeetCode(106.由中序和后序遍历建立二叉树)

    C++实现LeetCode(106.由中序和后序遍历建立二叉树)

    这篇文章主要介绍了C++实现LeetCode(106.由中序和后序遍历建立二叉树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 深入了解C++中map用法

    深入了解C++中map用法

    下面小编就为大家带来一篇深入了解C++中map用法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随想过来看看吧
    2016-06-06
  • 利用Matlab复刻扫雷小游戏

    利用Matlab复刻扫雷小游戏

    windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本程序参考《扫雷》的规则进行了简化,用Matlab实现,感兴趣的小伙伴可以学习一下
    2022-03-03
  • C++单链表实现大数加法

    C++单链表实现大数加法

    这篇文章主要为大家详细介绍了C++单链表实现大数加法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论