Strlen和Sizeof函数的区别

合集下载

求字符串长度

求字符串长度

字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目。

常见的获取字符串长度的方法包括如下几种。

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()的功能完全一样,它们仅仅返回字符而非字节的个数。

strlen总结

strlen总结

strlen(C语言函数)strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

头文件:cstring string.h功能:计算给定字符串的长度区别sizeofstrlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。

char aa[10];cout<<strlen(aa)<<endl; //结果是不定的char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3(此处不完全正确,结果可能是不定的,如果编译器将其他的非零字符串放在aa[10]的内存地址后,strlen结果还是不定的,MSP430在IAR编译测试过)(但是在vc6中结果为3,编译器会在“处自动添上\0。

)char aa[5]="hello";cout<<strlen(aa)<<endl; //结果5(此处不完全正确,理由如上,因为实际内存中,hello后面不一定是空(即\0))(还应视编译器而定)而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个取字节运算符,strlen是函数。

sizeof(aa) 返回10int a[10]; sizeof(a) 返回40 (根据语言int型c 是四个字节c++是四个java 是两个)⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。

Sizeof与Strlen的区别与联系

Sizeof与Strlen的区别与联系

Sizeof与Strlen的区别与联系1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int 类型。

该类型保证能容纳实现所建立的最大对象的字节大小。

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

3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。

sizeof还可以用函数做参数,比如:short f();printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。

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

5.大部分编译程序在编译的时候就把sizeof计算过了,看它是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。

char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;6.strlen的结果要在运行的时候才能计算出来,主要用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果接类型参数必须加括弧,如果是变量名可以不加括弧。

这是因为sizeof是个操作符不是个函数。

8.当适用了于一个结构类型时或变量,sizeof 返回实际的大小,当适用一静态地址空间数组,sizeof 归还全部数组的尺寸。

sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。

9.数组作为参数传给函数时,传递的是指针而不是数组,传递的是数组的首地址,如:fun(char [8])fun(char [])都等价于 fun(char *)在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。

如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去fun(unsiged char *p1, int len){unsigned char* buf = new unsigned char[len+1]memcpy(buf, p1, len);}我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度。

C++基础面真题

C++基础面真题

1.const符号常量:〔1〕、const char Xp〔2〕、char const Xp〔3〕、char X const p如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量。

如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

2.析构函数和虚函数的用法和作用?析构函数的作用是当对象生命期结束时释放对象所占用的资源。

析构函数用法:析构函数是特别的类成员函数它的名字和类名相同,没有返回值,没有参数不能随意调用也没有重载。

只是在类对象生命期结束时有系统自动调用。

虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联遍。

3.堆和栈的区别栈〔stack〕:由编译器自动分配释放,存放函数的参数值,局部变量的值等。

其操作方法类似于数据结构中的栈。

堆:一般由程序员分配释放,假设不释放,程序结束时可能由OS回收。

注意它与数据结构中的堆是两回事,分成分法类似。

4.头文件的作用是什么?1.通过头文件来调用库功能。

在很多场合,源代码不便〔或不准〕向用户公布,只要向用户提供头文件和二进制的库即可。

用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么完成的。

编译器会从库中提取出相应的代码。

2.头文件能加强类型平安检查。

如果某个接口被完成或被使用时,其方法与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

5.内存的分成分法有几种?1.从静态存储地域分配。

内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。

如全局变量。

2.在栈上创立。

在执行函数时,函数内局部变量的存储单元都可以在栈上创立,函数执行结束时这些存储单元自动被释放。

栈内存分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。

3.从堆上分配,亦称动态内存分配。

程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。

c语言获取字符串长度的函数

c语言获取字符串长度的函数

c语言获取字符串长度的函数摘要:1.函数strlen()2.函数sizeof()3.自定义函数计算字符串长度正文:在C 语言中,获取字符串长度的函数有以下几种:1.函数strlen()strlen() 函数是C 语言标准库中的一个函数,用于计算字符串的长度。

它接受一个字符指针作为参数,并返回字符串中字符的个数,不包括字符串结束符"0"。

使用strlen() 函数时,需要包含头文件<string.h>。

例如,假设有一个字符串"hello, world!",我们可以通过以下代码计算其长度:```c#include <stdio.h>#include <string.h>int main() {char str[] = "hello, world!";int length = strlen(str);printf("字符串长度为:%d", length);return 0;}```2.函数sizeof()sizeof() 函数是C 语言中的一个运算符,用于计算数据类型或变量在内存中占用的字节数。

我们可以使用sizeof() 函数来计算字符串的长度,但这种方法只适用于字符数组,而不适用于字符指针。

例如,我们可以通过以下代码计算字符串"hello, world!"的长度:```c#include <stdio.h>int main() {char str[] = "hello, world!";int length = sizeof(str) / sizeof(str[0]);printf("字符串长度为:%d", length);return 0;}```这里,我们首先计算字符数组str 在内存中占用的字节数,然后除以字符数组中每个字符的字节数(在C 语言中,字符占用一个字节),得到字符串的长度。

第3章 数组(习题答案及解析)

第3章 数组(习题答案及解析)

习题3 参考答案一、选择题3.1 C 分析:本题考查程序和数组的基本概念。

3.2 A 分析:字符串比较大小是以第1个不相同字符的大小为标准的,跟长度没有关系,B选项不正确;字符串比较大小除了使用库函数strcn3()以外,就只能靠自己写代码来实现了,而不能通过关系运算符来比较大小。

因为字符串在表达式中相当于const char*,即常字符指针,代表的是字符串的首地址,关系运算符会将两个字符串的首地址值比较大小,这是毫无意义的。

C选项不正确。

C语言中只有字符串常量而没有字符串变量,D选项描述不正确;空串的长度为0,而以空格打头的字符串的长度至少为1,因此A选项是正确。

3.3 A 分析:如果第一维的长度没有指定,则定义的同时需要完成初始化,否则不知道分配多大的内存空间给它,所以选项B、C错误;二维数组a[2][3]中只有两个元素,都是一维数组,一维下标最大只能是a[1],所以选项D错误;若完成初始化的二维数组,第一维的长度没有指定,则第一维的大小按如下规则确定:若初值个数能被第二维大小整除,所得的商就是第一维的大小,若不能整除,则所得的商加1作为第一维的大小,所以选项A相当于:double a[1][3] = {6};其中a[0][0]=6,其他元素赋值0,选项A正确,答案为A。

3.4 D 分析:本题考察的知识点是:字符串常量。

在C语言中,字符串常量是以双引号括起来的字符序列。

因此B选项和C选项不正确。

字符序列中可包含一些转义字符,转义字符都是以"\"开头的。

A选项中包含了三个"\",前两个(\\)代表了一个"\"字符,后面一个和"""一起(\")被看作一个""",所以该字符串缺少一个结束的""",因此不正确。

D选项的两个"""之间没有任何字符,代表的是一个空串,是合法的字符串常量,因此D选项正确。

CC++程序员面试指南

CC++程序员面试指南

char *p = (char *)malloc(100); strcpy(p, “ before”); free(p); //p 所指向的内存被释放,但是 p 的值不变 if(p != NULL) //检测不到错误 strcpy(p, “ after”); 为了避免这种情况,指针在 free 之后应赋值为 NULL。 3、 指针超越了变量的作用范围,这种情况让人防不胜防。 #include<iostream.h> void f(A *p) class A { { A a; public: p = &a; void Func(void) p->Func(); { } value = 3; void main(void) cout<<”in fun of A”<<endl; { } A *p; public: f(p); //a 的作用域结束 int value; p->Func(); // p 成了野指针 }; } 函数 f 结束时,变量 a 被释放,p 指向了垃圾内存,但是在 main 函数中又用 p 调用了 Fun, 而此时 p 所指向的内存不可用(a 释放后 p 就成了野指针) ,将导致内存操作错误。 常见的一道题: void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; getMemory(str); //执行完这句之后,str 的值仍为 NULL,如果想改变指针的值 strcpy(str,”hello world”);//GetMemory 的参数要为二级指针 printf(str); } ############################################################################### void *GetMemory(void) { char p[] = “ hello world”; return p; } void Test(void) { char *str = NULL; str = getMemory()();

C语言经典面试题目及答案详解(三)

C语言经典面试题目及答案详解(三)

C语言经典面试题目及答案详解(三)接着更新C语言面试题,希望能帮助到大家!1、变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。

一个变量可以在多个地方声明,但是只在一个地方定义。

加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。

说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。

2、写出 bool 、int、 float、指针变量与“零值”比较的if 语句bool 型数据: if( flag ) {A; } else {B; } int 型数据: if( 0 != flag ) {A; } else {B; }指针型数: if( NULL == flag ) {A; } else {B; } float 型数据: if ( ( flag >= NORM ) && ( flag <= NORM ) ) {A; }注意:应特别注意在 int、指针型变量和“零值”比较的时候,把“零值”放在左边,这样当把“==”误写成“=”时,编译器可以报错,否则这种逻辑错误不容易发现,并且可能导致很严重的后果。

3、sizeof 和 strlen 的区别sizeof 和 strlen 有以下区别:1. sizeof 是一个操作符,strlen 是库函数。

2. sizeof 的参数可以是数据的类型,也可以是变量,而strlen 只能以结尾为‘\0‘的字符串作参数。

3. 编译器在编译时就计算出了 sizeof 的结果。

而 strlen 函数必须在运行时才能计算出来。

并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。

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

注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使 用 strlen
}
我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长 度 看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以 看得很清楚:
char str[20]="0123456789"; int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束 符 0x00 为字符串结束。 int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数 组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
len_three << endl; 输出结果:23 and 4 and 1 点评:第一个输出结果23实际上每次运行可能不一样,这取决于
parr里面存了什么(从parr[0]开始知道遇到第一个NULL结束);第二 个结果实际上本意是想计算parr所指向的动态内存空间的大小,但是事 与愿违,sizeof认为parr是个字符指针,因此返回的是该指针所占的空 间(指针的存储用的是长整型,所以为4);第三个结果,由于*parr所 代表的是parr所指的地址空间存放的字符,所以长度为1。 ************
四、参考资料: Sizeof与Strlen的区别与联系(转)
1.sizeof操作符的结果类型是size_t,它在头文件中typedef 为unsigned int类型。 该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是 以''\0''结尾的。 sizeof还可以用函数做参数,比如: short f(); printf("%d\n", sizeof(f())); 输出的结果是sizeof(short),即2。
小,不关心里面存了多少数据。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 " <<
二、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数组时,编译器为其分配的数组空间大
大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组 所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下: 数组——编译时分配的数组空间大小; 指针——存储该指针所用的空间大小(存储该指针的地址的长度, 是长整型,应该为4); 类型——该类型所占的空间大小; 对象——对象的实际占用空间大小; 函数——函数的返回类型所占的空间大小。函数的返回类型不能 是void。 **************
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的 长度这就是sizeof(x)可以用来定义数组维数的原因 char str[20]="0123456789"; int a=strlen(str); //a=10; int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长 度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是 因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
Sizeof与Strlen的区别与联系
一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编
译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用பைடு நூலகம்返回动态分配的内存空间的
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = "0123456789"; sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获 得的是一个指针的之所占的空间,应该是
长整型的,所以是4 sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的 第一位'0' 所占的内存空间,是char类
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首 地址, 如: fun(char [8]) fun(char []) 都等价于 fun(char *) 在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不 知道数组的大小 如果想在函数内知道数组的大小, 需要这样做: 进入函数后用memcpy拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len) { unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len);
相关文档
最新文档