strlen函数原型 strlen strlen-原型,strlen-举例

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符''为止,然后返回计数器值(长度不包含“”)。strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因。sizeof操作符的结果类型是size t,它在头文件中typedef为unsigned int类型。

strlen_strlen -原型


strlenexternunsignedintstrlen(char*s);
在Visual C++6.0中,原型为size_tstrlen(constchar*string),其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedefunsignedintsize_t。
功能:计算字符串s的(unsignedint型)长度,不包括''在内
说明:返回s的长度,不包括结束符NULL。

strlen_strlen -举例:


strlen举例1:(在VisualC++6.0中运行通过)
#include<string.h>
#include<stdio.h>
intmain(void)
char*s="GoldenGlobalView";
printf("%shas%dchars",s,strlen(s));
getchar();
return0;

strlen_strlen -区别

strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到''停止。
charaa[10];cout<<strlen(aa)<<endl;//结果是不定的
charaa[10]={''};cout<<strlen(aa)<<endl;//结果为0
charaa[10]="jun";cout<<strlen(aa)<<endl;//结果为3
charaa[5]="hello";cout<<strlen(aa)<<endl;//结果5
而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
sizeof(aa)返回10
inta[10];sizeof(a)返回40(根据语言int型c是两个字节c++是四个java是两个)
⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
⒉sizeof是操作符(关键字),strlen是函数。
⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''''结尾的。
sizeof还可以用函数做参数,比如:
shortf();
printf("%dn",sizeof(f()));
输出的结果是sizeof(short),即2。
⒋数组做sizeof的参数不退化,传递给strlen就退化为指针了。
⒌大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因
charstr[20]="0123456789";
inta=strlen(str);//a=10;
intb=sizeof(str);//而b=20;
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
⒏当适用了于一个结构类型时或变量,sizeof返回实际的大小,
当适用一静态地空间数组,sizeof归还全部数组的尺寸。
sizeof操作符不能返回动态地被分派了的数组或外部的数组的尺寸
⒐数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char)
fun(char)
都等价于fun(char*)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小,需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsigedchar*p1,intlen){unsignedchar*buf=newunsignedchar[len+1]memcpy(buf,p1,len);}
我们能常在用到sizeof和strlen的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
charstr[20]="0123456789";
inta=strlen(str);//a=10;>>>>strlen计算字符串的长度,以结束符0x00为字符串结束。
intb=sizeof(str);//而b=20;>>>>sizeof计算的则是分配的数组str[20]所占的内存空间的大小,不受里面存储的内容改变。
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char*ss="0123456789";
sizeof(ss)结果4>>>>ss是指向字符串常量的字符指针,sizeof获得的是一个指针的值所占的空间,应该是长整型的,所以是4
sizeof(*ss)结果1>>>>*ss是第一个字符其实就是获得了字符串的第一位'0'所占的内存空间,是char类型的,占了1位
strlen(ss)=10>>>>如果要获得这个字符串的长度,则一定要使用strlen
sizeof返回对象所占用的字节大小.//正确
strlen返回字符个数.//正确
在使用sizeof时,有一个很特别的情况,就是数组名到指针蜕变,
charArray[3]={'0'};
sizeof(Array)==3;
char*p=Array;
strlen(p)==1;//sizeof(p)结果为4
在传递一个数组名到一个函数中时,它会完全退化为一个指针
看完以上你是否很清楚sizeof和strlen的区别了呢?还不明白的话,我们看下面几个例子:

第一个例子

char*ss="0123456789";
sizeof(ss)结果4===》ss是指向字符串常量的字符指针
sizeof(*ss)结果1===》*ss是第一个字符
大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度
这就是sizeof(x)可以用来定义数组维数的原因
charstr[20]="0123456789";
inta=strlen(str);//a=10;
intb=sizeof(str);//而b=20;
charss[]="0123456789";
sizeof(ss)结果11===》ss是数组,计算到位置,因此是10+1
sizeof(*ss)结果1===》*ss是第一个字符
charss[100]="0123456789";
sizeof(ss)结果是100===》ss表示在内存中的大小100×1
strlen(ss)结果是10===》strlen是个函数,内部实现是用一个循环计算到之前为止
intss[100]="0123456789";
sizeof(ss)结果400===》ss表示在内存中的大小100×4
strlen(ss)错误===》strlen的参数只能是char*且必须是以''结尾的
charq[]="abc";
charp[]="an";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是4332

第二个例子

classX{inti;intj;chark;};Xx;
cout<<sizeof(X)<<endl;结果12===》内存补齐
cout<<sizeof(x)<<endl;结果12同上

strlen函数原型 strlen strlen-原型,strlen-举例

第三个例子

charszPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(voidfun(charszPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
还有一位网友的说明也很好:
其实理解sizeof只需要抓住一个要点:栈
程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针来间接操作的。sizeof操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
charconst*static_string="Hello";
sizeof(static_string)是sizeof一个指针,所以在32bitsystem是4
charstack_string[]="Hello";
sizeof(stack_string)是sizeof一个数组,所以是6*sizeof(char)
char*string=newchar[6];
strncpy(string,"Hello",6");
sizeof(string)是sizeof一个指针,所以还是4。和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。
不管指针指向的内容在什么地方,sizeof得到的都是指针的栈大小
C++中对引用的处理比较特殊;sizeof一个引用得到的结果是sizeof一个被引用的对象的大小;所以
structO{inta,b,c,d,e,f,g,h;};intmain(){O&r=*newO;cout<<sizeof(O)<<endl;//32cout<<sizeofr<<endl;//也是32system("PAUSE");}
r引用的是整个的O对象而不是指向O的指针,所以sizeofr的结果和sizeofO完全相同。
自定义函数实现strlen()函数的功能。

  

爱华网本文地址 » http://www.aihuau.com/a/8103310103/54479.html

更多阅读

谈谈 Excel SUMIF函数用法 多条件求和 sumif日期条件求和

2010年9月1日 Surda 317 次 发表评论 阅读评论上篇文章跟大家分享了SUM函数非一般的用法,本文我们来品味SUMIF的魅力。SUMIF,根据指定条件对若干单元格求和。其函数原型:SUMIF(range,criteria,sum_range),参数:range 为用于条件判断的

模拟c++中的strstr函数 c语言中strstr函数

/************************************************************************//* 例子:请写出一个函数来模拟c++中的strstr函数:该函数的返回值是主传中字符子串的位置以后的所有字符,请不要使用任何c程序已有的函数函数名: strstr函

C++pow 函数 c pow函数怎么用

函数名称: pow函数原型: double pow( double x,double y );函数功能: 计算x的y次幂所属文件:&lt;math.h&gt;这个例子中计算了8的2次方:double

Qsort函数 qsort函数实现

http://blog.csdn.net/zhc6211026/archive/2007/12/28/1999062.aspxhttp://tech.sina.com.cn/s/2005-10-11/0905736736.shtml关于qsort的使用:qsort对于排序有更好的兼容性,可以对任何数据类型,采取个人需要的排序关键字和排序方法进行

VBASumif sumif函数

Excel SUMIF函数用法 多条件求和SUMIF,根据指定条件对若干单元格求和。其函数原型:SUMIF(range,criteria,sum_range),参数:range为用于条件判断的单元格区域criteria为确定哪些单元格将被相加的条件,其形式可以为数字、表达式或文本。

声明:《strlen函数原型 strlen strlen-原型,strlen-举例》为网友浅绿色清新分享!如侵犯到您的合法权益请联系我们删除