在C/C++中,字符串是以零('\0')结尾的。比如,对于下面的字符串:

"hello" 
 
在最后一个字符'd'后面,还有一个我们肉眼看不见的'\0'字符,作为该字符串的结束符。所以,"Hello"其在内存中的存储形式为:

'H' 'e' 'l' 'l' 'o' '\0'

最后有一个我们看不见的'\0'。明白了字符串的结尾方式,那么如何计算字符串的长度呢?比如:

例题1:
char str1[]="12345678";
char str2[]={'1','2','3','4','5','6','7','8'};
char str3[]={'1','2','3','\0','5','6','7','8'};
sizeof(str1)=?
sizeof(str2)=?
sizeof(str3)=?
strlen(str1)=?
strlen(str2)=?
strlen(str3)=?

分析:
str1是一个字符数组,由字符串"12345678"进行初始化。由于"12345678"含有一个结尾字符'\0',所以str1数组共有9个字符。 因此sizeof(str1)=9。

str2也是一个字符数组,它的长度由'1','2','3','4','5','6','7','8'8个字符初始化,并没有指明零字符。 因此sizeof(str2)=8。

str3同样由8个字符初始化,因此sizeof(str3)=8。

strlen函数只计算字符串中不含零的字符个数。因此:strlen(str1)=8。

而由于str2中最后一个字符不包含零,所以,str2不是一个有效的字符串, 因此strlen(str2)不确定。

而对于字符数组str3,在第4个字符为'\0',所以作为一个字符串,在此处结尾。所以strlen(str3)=3。

答案:
sizeof(str1)=9
sizeof(str2)=8
sizeof(str3)=8
strlen(str1)=8
strlen(str2)=无结束字符0,所以字符串溢出,不确定
strlen(str3)=3

例题2:实现strlen方法。

分析:既然字符串是以'\0'结尾的,那么实现strlen也就很简单了,直接从左往右遍历字符串,遇到'\0'就退出。
size_t strlen (const char * str)
{
    const char *eos = str;
    while( *eos++ )  
         ;
    return( eos - str - 1 );
}

那么,有没有不是以零结尾的字符串表示方法呢?实际上是有的。比如:UNICODE_STRING, ANSI_STRING。

这两种类型的字符串表示方法, 就不是以零结尾的了,而是以首地址和有效长度来定义字符串。

字符串的sizeof长度及strlen长度的更多相关文章

  1. 字符串长度函数strlen()

    如下是我的测试文件: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { ...

  2. php中常用的字符串长度函数strlen()与mb_strlen()实例解释

    int strlen ( string $string )  int strlen ( string $string )  获取给定字符串的[字节]长度 成功则返回字符串$string的长度,如果$s ...

  3. 玩转PHP(一)---php中处理汉字字符串长度:strlen和mb_strlen

    注:本文为小编原创,如若转载,请注明出处:http://blog.csdn.net/u012116457/article/details/42536039 今天正式开始学习PHP了,不过小编一不小心就 ...

  4. php获取字符串长度函数strlen和mb_strlen

    php获取字符串长度函数strlen和mb_strlencount() - 计算数组中的单元数目,或对象中的属性个数strlen — 获取字符串长度,一个汉字为3个字符mb_strlen() - 获取 ...

  5. php中处理汉字字符串长度:strlen和mb_strlen

    PHP内置的字符串长度函数strlen()无法正确处理中文字符串,它得到的只是字符串所占的字节数.对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍 ...

  6. 字符串 前篇 ---- sizeof()操作符和strlen()库函数

    本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符 ...

  7. C# 计算字符串在控制台中的显示长度

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  8. 限制标题字符串的长度,超过长度的截取并加上"..."

    /// <summary> /// 限制标题字符串的长度,超过长度的截取并加上"..." /// </summary> /// <param name ...

  9. string字符串长度和字节长度问题

    string str = "abcdef 安安安"; int i = str.Length; byte[] bt = System.Text.Encoding.Default.Ge ...

随机推荐

  1. httpHandlers path="*.sky"

    <httpHandlers> <add verb="*" path="*.sky" type="WebAppHttpHandlerT ...

  2. wal2json docker 试用

    基于官方的release 构建了一个docker 镜像,以下是测试使用 环境准备 docker-compose 文件 version: "3" services:   mypg: ...

  3. 使用async-profiler简单分析zeebe 工作流引擎的性能

    刚开始的时候直接使用的系统暴露的prometheus metrics,发现越高的版本反而性能越差,期间使用过了 perf 打算使用perf 生成火焰图的,但是因为符号缺失,只找到了占用较高的任务,详细 ...

  4. RaxML使用

    1.下载 https://github.com/stamatak/standard-RAxML 2.How many Threads shall I use? 重要的是要知道,RAxML PThrea ...

  5. 【day04】PHP

    一. 运算符 1.按功能分  (1)算术运算符  (2)字符运算符  (3)赋值运算符  (4)比较运算符  (5)逻辑运算符  (6)错误抑制符  (7)执行运算符 2.逻辑运算符 : ! & ...

  6. 基于sign的pose-graph残差函数构建

    沿sign的法线方向优化车辆位姿,优化目标函数也即残差函数构建过程如下:

  7. android 模拟输入框edittext控件按下回车或扫描头扫描到条码

    edtScan.setText(result); edtScan.onEditorAction(EditorInfo.IME_ACTION_NEXT); 场景:PDA都有扫描头,但有时想用自己的手机来 ...

  8. Azure Devops (VSTS) Extensions 开发小记

    我在使用tfx-cli打包Azure Devops插件时,输出了很黄很黄很亮瞎眼的(尤其是在Visual Studio Code采用了Dark Black Theme的情况下)警告warning: P ...

  9. 虚拟机安装CentOS 7

  10. Skywalking入门介绍,skywalking6.5.0 +mysql (windows) 搭建

    一. 介绍 1. 基本信息 SkyWalking 创建于2015年,提供分布式追踪功能.从5.x开始,项目进化为一个完成功能的Application Performance Monitoring系统. ...