• 目录视图
  • 摘要视图
  • 订阅

4.5.8  字符串的长度

字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目。常见的获取字符串长度的方法包括如下几种。

1.使用sizeof获取字符串长度

sizeof的含义很明确,它用以获取字符数组的字节数(当然包括结束符0)。对于ANSI字符串和UNICODE字符串,形式如下:

       
  1. sizeof(cs)/sizeof(char)
  2. sizeof(ws)/sizeof(wchar_t)

可以采用类似的方式,获取到其字符的数目。如果遇到MBCS,如"中文ABC",很显然,这种办法就无法奏效了,因为sizeof()并不知道哪个char是半个字符。

2.使用strlen()获取字符串长度

strlen()及wcslen()是标准C++定义的函数,它们分别获取ASCII字符串及宽字符串的长度,如:

       
  1. size_t strlen( const char *string );
  2. size_t wcslen( const wchar_t *string );

strlen()与wcslen()采取0作为字符串的结束符,并返回不包括0在内的字符数目。

3.使用CString::GetLength()获取字符串长度

CStringT继承于CSimpleStringT类,该类具有函数:

       
  1. int GetLength( ) const throw( );

GetLength()返回字符而非字节的数目。比如:CStringW中,"中文ABC"的GetLength()会返回5,而非10。那么对于MBCS呢?同样,它也只能将一个字节当做一个字符,CStringA表示的"中文ABC"的GetLength()则会返回7。

4.使用std::string::size()获取字符串长度

basic_string同样具有获取大小的函数:

       
  1. size_type length( ) const;
  2. size_type size( ) const;

length()和size()的功能完全一样,它们仅仅返回字符而非字节的个数。如果遇到MCBS,它的表现和CStringA::GetLength()一样。

5.使用_bstr_t::length()获取字符串长度

_bstr_t类的length()方法也许是获取字符数目的最佳方案,严格意义来讲,_bstr_t还称不上一个完善的字符串类,它主要提供了对BSTR类型的封装,基本上没几个字符串操作的函数。不过,_bstr_t 提供了length()函数:

       
  1. unsigned int length ( ) const throw( );

该函数返回字符的数目。值得称道的是,对于MBCS字符串,它会返回真正的字符数目。

现在动手

编写如下程序,体验获取字符串长度的各种方法。

【程序 4-8】各种获取字符串长度的方法

       
  1. 01  #include "stdafx.h"
  2. 02  #include "string"
  3. 03  #include "comutil.h"
  4. 04  #pragma comment( lib, "comsuppw.lib" )
  5. 05
  6. 06  using namespace std;
  7. 07
  8. 08  int main()
  9. 09  {
  10. 10      char s1[] = "中文ABC";
  11. 11      wchar_t s2[] = L"中文ABC";
  12. 12
  13. 13      //使用sizeof获取字符串长度
  14. 14      printf("sizeof s1: %d/r/n", sizeof(s1));
  15. 15      printf("sizeof s2: %d/r/n", sizeof(s2));
  16. 16
  17. 17      //使用strlen获取字符串长度
  18. 18      printf("strlen(s1): %d/r/n", strlen(s1));
  19. 19      printf("wcslen(s2): %d/r/n", wcslen(s2));
  20. 20
  21. 21      //使用CString::GetLength()获取字符串长度
  22. 22      CStringA sa = s1;
  23. 23      CStringW sw = s2;
  24. 24
  25. 25      printf("sa.GetLength(): %d/r/n", sa.GetLength());
  26. 26      printf("sw.GetLength(): %d/r/n", sw.GetLength());
  27. 27
  28. 28      //使用string::size()获取字符串长度
  29. 29      string ss1 = s1;
  30. 30      wstring ss2 = s2;
  31. 31
  32. 32      printf("ss1.size(): %d/r/n", ss1.size());
  33. 33      printf("ss2.size(): %d/r/n", ss2.size());
  34. 34
  35. 35      //使用_bstr_t::length()获取字符串长度
  36. 36      _bstr_t bs1(s1);
  37. 37      _bstr_t bs2(s2);
  38. 38
  39. 39      printf("bs1.length(): %d/r/n", bs1.length());
  40. 40      printf("bs2.length(): %d/r/n", bs2.length());
  41. 41
  42. 42      return 0;43 }

输出结果如图4-16所示。

 
(点击查看大图)图4-16  运行结果

获取字符串长度的几种办法相关推荐

  1. (转)Shell中获取字符串长度的七种方法

    Shell中获取字符串长度的七种方法 原文:http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell脚本中很常用,下面 ...

  2. Shell中获取字符串长度的七种方法

    求字符串操作在shell脚本中很常用,下面归纳.汇总了求字符串的几种可能方法: [方法一]:利用${#str}来获取字符串的长度 [方法二]:利用awk的length方法 备注: 1) 最好用{}来放 ...

  3. c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...

  4. golang中获取字符串长度的办法

    1.不同字符与获取字符串长度 获取字符串长度,是字符串操作的重要方法.理论来说,获取字符串长度,只要从头到尾查找一遍就可以了.但遗憾的是,不同字符具有不同的编码格式.拉丁字母一个字符只要一个字节就行, ...

  5. C++ 获取string字符串长度的三种方法

    1.用string的成员方法length()获取字符串长度 length()比较直观,表示的就是该字符串的长度. #include <string> #include <iostre ...

  6. Go 学习笔记(31)— 字符串 string、字符 rune、字节 byte、UTF-8 和 Unicode 区别以及获取字符串长度

    1. 字符串 string 类型 Go 语言中字符串的内部实现使用 UTF-8 编码,通过 rune 类型,可以方便地对每个 UTF-8 字符进行访问.当然, Go 语言也支持按照传统的 ASCII ...

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

    这篇文章主要介绍了Shell脚本中计算字符串长度的5种方法,来自于个人Shell脚本长期的开发经验,需要的朋友可以参考下 有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前S ...

  8. linux shell 显示字符串长度,Shell获取字符串长度的多种方法总结

    前言 我们在日常工作中,对于求字符串操作在shell脚本中很常用,实现的方法有很多种,下面就来给大家归纳.汇总了求字符串的几种可能方法,话不多说了,来一起看看详细的介绍吧. 方法如下: [方法一]:利 ...

  9. Lua中获取字符串长度整理

    在 Lua 中,获取字符串长度我们一般使用 #str(不建议使用 string.len(str) )! local str = "abc" local len = #str pri ...

最新文章

  1. php 变更 obj,PHP: 不向后兼容的变更 - Manual
  2. ModuleNotFoundError: No module named ‘config‘
  3. TCP的三次握手、四次挥手,干货满满!
  4. 诺亚面向语音语义的深度学习研究进展
  5. Django admin的一些有用定制
  6. 验证用户名和密码业务逻辑
  7. Nokia手机短信发件人显示乱码问题解决
  8. aes js 加盐值 解密_Java已有AES加解密,现需要前端Javascript加密调接口,返回的数据需要解密,目前互..._慕课猿问...
  9. 二、PHP基础——连接msql数据库进行增删改查操作 实战:新闻管理项目
  10. python socketserver连接数量限制_python中socketserver的一个疑问
  11. 高可用的MongoDB集群
  12. C# WPF 定时器
  13. 分享一下我制作的Bat批处理程序-PC Tools(含源码)
  14. 极大似然法(ML)与最大期望法(EM)
  15. 设配器模式不止是补救,有时更像是一个创造者
  16. 网页怎么预先加载模型_修补预先训练的语言模型
  17. centos 安装gstreamer_64位CentOS系统中安装32位开发库
  18. mac开机启动mysql_mac 设置mysql开机自启动
  19. 泛函分析笔记(二十一) 障碍问题
  20. 腾讯手游助手android文件夹,腾讯手游助手安装的apk在哪个文件夹?腾讯手游助手游戏安装目录介绍...

热门文章

  1. ⑮霍兰德EA*型如何选专业?高考志愿填报选专业
  2. js实现简单点名册.
  3. KATEX简易语法:
  4. Docker更改镜像源
  5. 增强学习系列之(二):实现一个简单的增强学习的例子
  6. 操作系统学习(2) 进程管理
  7. php 解析收货人信息 提取 收货人 地址 电话
  8. UTC、CST、GMT等时区详解
  9. 怎么远程控制他人电脑
  10. 安装多个Vivado版本后,双击.xpr如何启动最新版本