获取C/C++字符串、字符数组长度

获取C/C++字符串、字符数组长度在 C C 中常用的获取字符串长度或者字符串数组长度的函数有 sizeof length strlen size 其中 strlen str 和 str length 和 str size 都可以用来求字符串的长度 str length 和 str size 是用于求 string 类对象的成员函数 strlen str 是用于求字符串数组的长度 其参数是 cha

在C/C++中常用的获取字符串长度或者字符串数组长度的函数有

sizeof()

length()

strlen()

size()

辨析strlen() 与 sizeof() 的区别

strlen(char*)

函数求是字符串的实际长度,它可以用来获取动态实际字符数组的长度,是从开始到遇到第一个“\0”,如果只是定义没有赋予初始值,这个结果是不确定的,它会从数组的首地址开始一直找下去,直到遇到“\0”停止查找。

sizeof()

example

char str[20]="0"; int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。 int b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响
char *str1="absde"; char str2[]="absde"; char str3[8]={ 
  'a',}; char ss[] = "0"; 输出: sizeof(str1)=4; sizeof(str2)=6; sizeof(str3)=8; sizeof(ss)=11

首先说明一点,char类型占一个字节,所以sizeof(char)是1,这点要理解

str1是一个指针,只是指向了字符串”absde”而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节

str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串”absde”占的总空间。”absde”中,共有a b s d e \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6

str3已经定义成了长度是8的数组,所以sizeof(str3)为8

str4和str2类似,’0’ ‘1’ … ‘9’加上’\0’共11个字符,所以ss占的空间是8

总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而且char*=”aaa”的写法现在不被提倡,应予以避免

而strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。


一、sizeof

sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。 具体而言,当参数分别如下时,sizeof返回的值表示的含义如下: 数组——编译时分配的数组空间大小; 指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4); 类型——该类型所占的空间大小; 对象——对象的实际占用空间大小; 函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。 

二、strlen

strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。 它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。 

三、举例:

eg1、char arr[10] = "What?"; int len_one = strlen(arr); int len_two = sizeof(arr); cout << len_one << " and " << len_two << endl; 输出结果为:5 and 10 点评:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。 eg2、char * parr = new char[10]; int len_one = strlen(parr); int len_two = sizeof(parr); int len_three = sizeof(*parr); cout << len_one << " and " << len_two << " and " << len_three << endl; 输出结果:23 and 4 and 1 点评:第一个输出结果23实际上每次运行可能不一样,这取决于parr里面存了什么(从parr[0]开始知道遇到第一个NULL结束);第二个结果实际上本意是想计算parr所指向的动态内存空间的大小,但是事与愿违,sizeof认为parr是个字符指针,因此返回的是该指针所占的空间(指针的存储用的是长整型,所以为4);第三个结果,由于*parr所代表的是parr所指的地址空间存放的字符,所以长度为1。 

string 类的常见应用

string s = "hello world"; int len = s.lenght(); cout<<len< 
    

在C++中可以用string类来代替C中的char数组形式的字符串,但是有些情况下是需要转换成C语言风格的,如以下代码:

#include 
       #include 
       #define MAX 51 int main(){ char s1 [MAX]; char s2 [MAX]; scanf("%s%s",s1,s2); int len = strlen(s1); for (int i=0;i 
     
       if(s1[i]==s2[i]) 
      printf( 
      "1"); 
      else 
      printf( 
      "0"); } 
      printf( 
      "\n"); 
      return 
      0; } 
     

这里需要一个个的访问实际数组中的元素,当时如果利用C++中的sizeof函数时,获取的是数组的固定空间,而不是实际的动态空间。所以这里只能用strlen(str)来获取char数组的实际长度(也即是用户输入的字符串的长度),如果用sizeof(str)所得到的长度大小为51。

string类型的字符串转换成char数组字符串

string filename = "test.txt"; ifstream in ; in.open(filename.c_str());

为了使用文件打开函数,必须将string类型的变量转换为字符串数组

#ifndef _ITERATOR_DEBUG_LEVEL #define _ITERATOR_DEBUG_LEVEL 0 #else #undef _ITERATOR_DEBUG_LEVEL #define _ITERATOR_DEBUG_LEVEL 0 #endif #include 
       #include 
       //string字符串->c字符串转换 void main() { //string -> char* string s1 = "far away"; const char* c = s1.c_str(); printf("%s\n",c); // string s2 = c; //string->char[] //从string中赋值字符到char[] char arr[50] = { 
     0}; s1.copy(arr,4,0); cout << arr << endl; system("pause"); }

string字符串的输入输出

string类重载了输入输出的运算符,用”>>”进行输入,用”<<”进行输出

#include 
       #include 
       using namespace std; int main(){ string s; cin >> s; //输入字符串 cout << s << endl; //输出字符串 system("pause"); return 0; }

访问字符串中得字符

string 字符串也可以像字符串数组一样按照下标来访问其中的每一个字符。string 字符串的起始下标仍是从 0 开始。请看下面的代码:

#include 
       using namespace std; //string遍历 void main(){ string s1 = "abcdefg"; //1、数组方式 cout << "数组方式:" << endl; for (int i = 0; i < s1.length(); i++){ cout < 
     
       //2、迭代方式 
      cout << 
      "迭代方式:" << endl; 
      for ( 
      string::iterator it = s1.begin(); it != s1.end(); it++){ 
      cout<<*it<< endl; } system( 
      "pause"); } 
     

字符串的拼接

//字符串拼接 void main() { string s1 = "alan"; string s2 = "xiho"; //1. string s3 = s1 + s2; string s4 = " wahaha"; //2. s3.append(s4); cout << s3 << endl; system("pause"); }

四、参考资料:

Sizeof与Strlen的区别与联系(转)

2.sizeof是算符,strlen是函数。

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

上面是对静态数组处理的结果,如果是对指针,结果就不一样了

型的,占了 1 位

strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200419.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:53
下一篇 2026年3月20日 上午10:53


相关推荐

  • 数据挖掘建模过程有哪些_大数据建模与数据挖掘

    数据挖掘建模过程有哪些_大数据建模与数据挖掘本课程以SPSSModeler为应用软件,以数据挖掘项目生命周期为线索,以实际数据挖掘项目为例,讲解了从项目商业理解开始,到后应用Modeler软件实现的挖掘过程。…

    2025年9月12日
    10
  • mysql中多表嵌套查询例子_mysql子查询嵌套规则

    mysql中多表嵌套查询例子_mysql子查询嵌套规则本文实例分析了MySQL嵌套查询。分享给大家供大家参考,具体如下:MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQLUserManual):1.SELECT语句的子查询语法:代码如下:SELECT…FROM(subquery)ASname…先创建一个表:CREATETABLEt1(s1INT,s2CHAR(…

    2022年10月21日
    5
  • readprocessmemory函数分析_in the process

    readprocessmemory函数分析_in the process函数功能:该函数从指定的进程中读入内存信息,被读取的区域必须具有访问权限。函数原型:BOOLReadProcessMemory(HANDLEhProcess,LPCVOIDlpBaseAddress,LPVOIDlpBuffer,DWORDnSize,LPDWORDlpNumberOfBytesRead);参数:hProcess:进程句柄

    2022年10月4日
    6
  • 【计量经济学导论】16. 面板数据模型

    【计量经济学导论】16. 面板数据模型本文主要介绍了面板数据模型的几种常用的模型设定及其参数估计方法 以及模型选择的检验方法

    2026年3月17日
    2
  • kafka 集群运维和使用「建议收藏」

    kafka 集群运维和使用「建议收藏」最近在维护kafka集群,遇到了很多问题都需要记录下,1. kafka的topic级别的配置修改

    2022年5月29日
    32
  • 双线性插值 一文全讲解

    双线性插值 一文全讲解1、原理在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。  越是简单的模型越适合用来举例子,我们就举个简单的图像:33的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):2343822674…

    2022年5月5日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号