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

目录
  • 计算字符串长度的几种方式
    • 自定义函数
    • 使用string头文件中的strlen()函数
    • 使用sizeof()操作符
  • 计算字符串长度,使用sizeof和strlen的坑
    • 使用strlen计算
    • 使用sizeof计算

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

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'字符;

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

(0)

相关推荐

  • 盘点分析C语言中少见却强大的字符串函数

    目录 正片开始 字符串函数 strcpy strcat strcmp strstr strtok strerror 正片开始 字符串函数 首先神魔是字符串函数? 指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝,计算长度,字符查找等的函数. 功能:把src所指由NUL结束的字符串复制到dest所指的 数组 中. 返回指向dest结尾处字符 (NUL)的 指针 . 像之前我写到过的 strcpy,strcat,strcmp 这些函

  • C语言初识变量常量字符串转义符及注释方式简介

    目录 一:变量与常量 1.1:变量 1.1.1:变量的分类 1.1.2:变量的优先性 1.2:常量 1.2.1:#define定义 1.2.2:枚举常量 1.2.3:const修饰的常量 二:字符串介绍 三:转义字符的介绍 三:注释方式的介绍 一:变量与常量 1.1:变量 生活中有些值是可变的(比如年龄,体重,薪资). 下面我们举一个简单的例子表示变量的创建与使用. 1.1.1:变量的分类 局部变量 全局变量 这里主要介绍一下全局变量与局部变量作用域与生命周期. 作用域:通俗来讲,也就是一个变量

  • C语言多种方法实现一个函数左旋字符串中K个字符

    目录 前言 法一.将左旋1次这个动作执行k次 法二.多次逆序字符串 前言 今天看到一个有趣的笔试题:实现一个函数,可以左旋字符串中的k个字符.示例如下: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 提示:以下是本篇文章正文内容,下面案例可供参考 法一.将左旋1次这个动作执行k次 这个方法的思路我来简单介绍一下: 现有1个字符串abcd 我们将a移出来,然后bcd前会空出一个位置 将bcd向前移动一个位置,最后把a放入最后一个位置,即可完成1次左旋 那么1次完成了,对于左旋

  • Shell脚本中计算字符串长度的5种方法

    有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前Shell中获取字符串的长度的多种方法,在这里分享给大家,方法如下: 方法1: 使用wc -L命令 wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数. 复制代码 代码如下: echo "abc" |wc -L 方法2: expr length string 使用expr length可以获取string的长度 方法3: awk获取域的个

  • java中计算字符串长度的方法及u4E00与u9FBB的认识

    字符串采用unicode编码的方式时,计算字符串长度的方法找出UNICODE编码中的汉字的代表的范围"\u4E00" 到"\u9FBB"之间,由于一个汉字代表两个字符所以可以采用如下方法进行计算字符串的长度 复制代码 代码如下: public static int getCharLength(String content) { int count = 0; for (int i = 0, len = content.length(); i < len; ++i

  • Shell脚本计算字符串长度和判断字符串为空小技巧

    一些需要注意的脚本问题 计算字符串长度可用的三种方法: 复制代码 代码如下: echo "$str"|awk '{print length($0)}' expr length "$str" echo "$str"|wc -c 但是第三种得出的值会多1,可能是把结束符也计算在内了 判断字符串为空的方法有三种: 复制代码 代码如下: if [ "$str" =  "" ] if [ x"$str&qu

  • js 判断计算字符串长度/判断空的简单方法

    计算字符串长度可用的三种方法: 复制代码 代码如下: echo "$str"awk '{print length($0)}' expr length "$str" echo "$str"wc -c 但是第三种得出的值会多1,可能是把结束符也计算在内了.判断字符串为空的方法有三种: 复制代码 代码如下: if [ "$str" = "" ] if [ x"$str" = x ] if [ 

  • 在C语言中输入中文字符串讲解

    C语言中的字符串是以ASCII码表的形式存入的,输入英文字符是以英文字符对应的ASCII码的形式进入寄存器中的,例如输出hello world!: 将c反汇编得到, 可以看到h的ASCII码是68,e的ASCII码是65等等存放进内存的,那中文字呢?中文字并没有对应的ASCII码,还可以显示出来吗? 答案当然是肯定的,在计算机中存储中文使用的编码规则是GB2312或GB2312-80,规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样我们就可以组合

  • mybatis 映射文件中if标签判断字符串相等的两种方式

    mybatis 映射文件中,if标签判断字符串相等,两种方式: 因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串sex变量是否是字符串Y的时候, <if test="sex=='Y'.toString()"> <if test = 'sex== "Y"'> 注意: 不能使用 <if test="sex=='Y'"> and 1=1 </if> 因为mybatis会把'Y'解析为字

  • Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题

    目录 使用Redis实现消息队列 基于List的消息队列 分析下源码实现 基于Streams的消息队列 分析下源码实现 stream的结构 streamCG消费者组 streamConsumer消费者结构 发布订阅 普通的订阅 基于模式(pattern)的发布/订阅 看下源码实现 总结 参考 使用 Redis 实现消息队列 Redis 中也是可以实现消息队列 不过谈到消息队列,我们会经常遇到下面的几个问题 1.消息如何防止丢失: 2.消息的重复发送如何处理: 3.消息的顺序性问题: 关于 mq

  • javaScript中定义类或对象的五种方式总结

    第一种方式: 工厂方法 能创建并返回特定类型的对象的工厂函数(factory function). function createCar(sColor){ var oTempCar = new Object; oTempCar.color = sColor; oTempCar.showColor = function (){ alert(this.color); }; return oTempCar; } var oCar1 = createCar(); var oCar2 = createCa

  • Java字符串写入文件三种方式的实现

     Java字符串写入文件三种方式的实现 1.使用FileWriter String str="hello world!"; FileWriter writer; try { writer = new FileWriter("E:/token.txt"); writer.write(str); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } 2.使用Fil

  • Vue 中可以定义组件模版的几种方式

    前端组件化开发已经是一个老生常谈的话题了,组件化让我们的开发效率以及维护成本带来了质的提升. 当然因为现在的系统越来越复杂庞大,所以开发与维护成本就变得必须要考虑的问题,因此滋生出了目前的三大前端框架 Vue.Angular.React. 那今天我们就来看看 Vue 中有哪些定义组件模版的方式以及他们之间的一些差别. 字符串形式 Vue 最简单直接的一种定义组件模版的方式,但是方式写起来很不友好,就像我们以前拼接 HTML 元素是一样的,很痛苦,所以我们并不常用 Vue.component("m

随机推荐