CC++中strlen的⽤法
strlen
strlen所作的仅仅是⼀个计数器的⼯作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚⾄是某个不确定的内存区域)开始扫描,直到碰到第⼀个字符串结束符'\0'为⽌,然后返回计数器值。
原型:extern unsigned int strlen(char *s);,在中,原型为 strlen(const char *string);,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t;。
头⽂件:string.h
格式:strlen (字符数组名)
功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内
说明:返回s的长度,不包括结束符NULL。
相关函数:
TCHAR.H routine _UNICODE & _MBCS not defined_MBCS defined_UNICODE defined_tcslen
strlen strlen wcslen
_tcsclen strlen_mbslen wcslen
举例1:(在Visual C++6.0中运⾏通过)
#include
#include
int main(void)
{
char *s="Golden Global View";
printf("%s has %d chars",s,strlen(s));
getchar();
return 0;
}
与sizeof()的区别
strlen(char*)函数求的是字符串的实际长度,它求得⽅法是从开始到遇到第⼀个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa⾸地址⼀直下去,直到遇到'\0'停⽌。
char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3
⽽sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是⼀个操作符,strlen是函数。
sizeof(aa) 返回10
int a[10]; sizeof(a) 返回40 (根据语⾔int型 c 是两个字节 c++是四个 java 是两个)
⒈sizeof操作符的结果类型是,它在头⽂件中typedef为unsigned int类型。
该类型保证能容纳实现所建⽴的最⼤对象的字节⼤⼩。
⒉sizeof是操作符(关键字),strlen是函数。
⒊sizeof可以⽤类型做参数,strlen只能⽤char*做参数,且必须是以''\0''结尾的。
sizeof还可以⽤函数做参数,⽐如:
short f();
printf("%d\n",sizeof(f()));
输出的结果是sizeof(short),即2。
⒋数组做sizeof的参数不退化,传递给strlen就退化为了。
⒌⼤部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以⽤来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //⽽b=20;
6.strlen的结果要在运⾏的时候才能计算出来,是⽤来计算字符串的长度,不是类型占内存的⼤⼩。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
⒏当适⽤了于⼀个结构类型时或变量, sizeof 返回实际的⼤⼩,
当适⽤⼀静态地空间数组, sizeof 归还全部数组的尺⼨。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺⼨
⒐数组作为参数传给函数时传的是指针⽽不是数组,传递的是数组的⾸地址,
如:
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 的时候,通常是计算字符串数组的长度
看了上⾯的详细解释,发现两者的使⽤还是有区别的,从这个例⼦可以看得很清楚:
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=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时,有⼀个很特别的情况,就是数组名到指针蜕变,
char Array[3] = {'0'};
c++中string的用法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)可以⽤来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //⽽b=20;
⼤部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度
这就是sizeof(x)可以⽤来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //⽽b=20;
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第⼀个字符
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表⽰在内存中的⼤⼩ 100×1
strlen(ss) 结果是10 ===》strlen是个函数,内部实现是⽤⼀个循环计算到\0之前为⽌
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表⽰再内存中的⼤⼩ 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以'\0'结尾的
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2
第⼆个例⼦
class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上
第三个例⼦
char szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针⼤⼩)
还有⼀位⽹友的说明也很好:
其实理解 sizeof 只需要抓住⼀个要点:栈
程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针来间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
char const * static_string = "Hello";
sizeof(static_string) 是 sizeof ⼀个指针,所以在 32bit system 是 4
char stack_string[] = "Hello";
sizeof(stack_string) 是 sizeof ⼀个数组,所以是 6 * sizeof(char)
char * string = new char[6];
strncpy(string,"Hello",6");
sizeof(string) 是 sizeof ⼀个指针,所以还是 4。和第⼀个不同的是,这个指针指向了动态存储区⽽不是静态存储区。不管指针指向的内容在什么地⽅,sizeof 得到的都是指针的栈⼤⼩
C++ 中对引⽤的处理⽐较特殊;sizeof ⼀个引⽤得到的结果是 sizeof ⼀个被引⽤的对象的⼤⼩;所以
struct O
{
int a,b,c,d,e,f,g,h;
};
int main()
{
O & r = *new O;
cout << sizeof(O) << endl; // 32
cout << sizeof r << endl; // 也是 32
system("PAUSE");
}
r 引⽤的是整个的 O 对象⽽不是指向 O 的指针,所以 sizeof r 的结果和 sizeof O 完全相同。
⾃定义函数实现strlen()函数的功能
下⾯⼏种实现strlen函数的⼤家参考
-
------------------------------------------------1:start------------------------------------
#include
#include
typedef unsigned int u_int;
u_int Mystrlen(const char *str)
{
u_int i;
assert(str != NULL);
for (i = 0; str[i]!= '\0'; i++);
return i;
}
-
-----------------------------------------------1:end--------------------------------------
-------------------------------------------------2:start--------------------------------------
int strlen(const char *str)
{
assert(str != NULL);
int len = 0;
while((*str++) != '\0')
len++;
return len;
}
------------------------------------------------2:end ------------------------------------------
-
-----------------------------------------------3:start------------------------------------------
int strlen(const char *str)
{
assert(str);
const char *p = str;
while(*p++!=NULL);
return p - str - 1;
}
-------------------------------------------------3:end-----------------------------------------
-------------------------------------------------4:start----------------------------------------
int strlen(const char *str)
{
assert(str);
if (*str==NULL)
return 0;
else
return (1 + strlen(++str));
}
-----------------------------------------------4:end----------------------------------------
-------------------------------------------------5:start----------------------------------------
size_t strlen(const char *s)
{
const char *sc;
f or (sc = s; *sc != '\0'; ++sc)
;
r eturn sc - s;
}
-----------------------------------------------5:end----------------------------------------
以上各种实现的⽅式都是⼤同⼩异的,有的⽤的是变量,有的⽤的是。
其中,最后⼀个⽤的是递归的⽅式。其实,在实现库函数的时候,是规定不可以调⽤其他的库函数的,这⾥只是给⼤家⼀个⽅法,不⽤变量就可以实现strlen。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论