strlen是不是只能计算字符的长度?就是只能计算char数组最大长度类型的长度么?

strlen 与sizeof - code2012 - 博客园
加油,坚持,努力,自信
posts - 107, comments - 17, trackbacks - 0, articles - 3
这是一个,请在下列中选择浏览
1.C语言函数
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
函数简介程序举例与sizeof()的区别自定义函数实现strlen()函数的功能
  原型: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
  举例1:(在Visual C++6.0中运行通过)
  #include &string.h&
  #include&stdio.h&
  int main(void)
  char *s="Golden Global View";
  printf("%s has %d chars",s,strlen(s));
  getchar();
  return 0;
  strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
  char aa[10];cout&&strlen(aa)&& //结果是不定的
  char aa[10]={'\0'}; cout&&strlen(aa)&& //结果为0
  char aa[10]="jun"; cout&&strlen(aa)&& //结果为3
  而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
  sizeof(aa) 返回10
  int a[10]; sizeof(a) 返回40
  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]="";
  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 的时候,通常是计算字符串数组的长度
  看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
  char str[20]="";
  int a=strlen(str); //a=10; &&&& strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
  int b=sizeof(str); //而b=20; &&&& sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
  上面是对处理的结果,如果是对指针,结果就不一样了
  char* ss = "";
  sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
  长整型的,所以是4
  sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类
  型的,占了 1 位
  strlen(ss)= 10 &&&& 如果要获得这个字符串的长度,则一定要使用 strlen
  sizeof返回对象所占用的字节大小. //正确
  strlen返回字符个数. //正确
  在使用sizeof时,有一个很特别的情况,就是数组名到指针蜕变,
  char Array[3] = {'0'};
  sizeof(Array) == 3;
  char *p = A
  sizeof(p) == 1;//sizeof(p)结果为4
  在传递一个数组名到一个函数中时,它会完全退化为一个指针
  ----------------------------------------------------------
  看完以上你是否很清楚sizeof和strlen的区别了呢?还不明白的话,我们看下面几个例子:
  第一个例子
  char* ss = "";
  sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
  这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
  大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
  这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
  char ss[] = "";
  sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  char ss[100] = "";
  sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100&1
  strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
  int ss[100] = "";
  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
  cout&&sizeof(X)&& 结果 12 ===》内存补齐
  cout&&sizeof(x)&& 结果 12 同上
  第三个例第一个例子
  char* ss = "";
  sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  char ss[] = "";
  sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  char ss[100] = "";
  sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100&1
  strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
  int ss[100] = "";
  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
  cout&&sizeof(X)&& 结果 12 ===》内存补齐
  cout&&sizeof(x)&& 结果 12 同上
  第三个例子
  char szPath[MAX_PATH]
  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
  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,
  int main()
  O & r = *new O;
  cout && sizeof(O) && // 32
  cout && sizeof r && // 也是 32
  system("PAUSE");
  r 引用的是整个的 O 对象而不是指向 O 的指针,所以 sizeof r 的结果和 sizeof O 完全相同。
  下面几种实现strlen函数的大家参考
  -------------------------------------------------1:start------------------------------------
  #include &stdio.h&
  #include &assert.h&
  typedef unsigned int u_
  u_int Mystrlen(const char *str)
  assert(str != NULL);
  for (i = 0; str[i]!= '\0'; i++);
  ------------------------------------------------1:end--------------------------------------
  -------------------------------------------------2:start--------------------------------------
  int strlen(const char *str)
  assert(str != NULL);
  int len = 0;
  while((*str++) != '\0')
  len++;
  ------------------------------------------------2:end ------------------------------------------
  ------------------------------------------------3:start------------------------------------------
  int strlen(const char *str)
  assert(str);
  const char *p =
  while(*p++!=NULL);
  return p - str - 1;
  -------------------------------------------------3:end-----------------------------------------
  -------------------------------------------------4:start----------------------------------------
  int strlen(const char *str)
  assert(str);
  if (*str==NULL)
  return 0;
  return (1 + strlen(++str));
  -----------------------------------------------4:end----------------------------------------
  以上各种实现的方式都是大同小异的,有的用的是变量,有的用的是指针。
  其中,最后一个用的是递归的方式。其实,在实现库函数的时候,是规定不可以
  调用其他的库函数的,这里只是给大家一个方法,不用变量就可以实现strlen。头文件:#include &string.h&
strlen()函数用来计算字符串的长度,其原型为:
& & unsigned&int strlen (char *s);
【参数说明】s为指定的字符串。
strlen()用来计算指定的字符串s 的长度,不包括结束字符&\0&。
【返回值】返回字符串s 的字符数。
注意一下字符数组,例如
& & char str[100] = &http://see./cpp/u/biaozhunku/&;
定义了一个大小为100的字符数组,但是仅有开始的11个字符被初始化了,剩下的都是0,所以 sizeof(str) 等于100,strlen(str) 等于11。
如果字符的个数等于字符数组的大小,那么strlen()的返回值就无法确定了,例如
& & char str[6] = &abcxyz&;
strlen(str)的返回值将是不确定的。因为str的结尾不是0,strlen()会继续向后检索,直到遇到'\0',而这些区域的内容是不确定的。
注意:strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。而sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。
【函数示例】取得字符串 的长度。
#include&stdio.h&
#include&string.h&
int main()
char *str1 = &http://see./cpp/u/shipin/&;
char str2[100] = &http://see./cpp/u/shipin_liming/&;
char str3[5] = &12345&;
printf(&strlen(str1)=%d, sizeof(str1)=%d\n&, strlen(str1), sizeof(str1));
printf(&strlen(str2)=%d, sizeof(str2)=%d\n&, strlen(str2), sizeof(str2));
printf(&strlen(str3)=%d, sizeof(str3)=%d\n&, strlen(str3), sizeof(str3));
运行结果:
strlen(str1)=38, sizeof(str1)=4
strlen(str1)=45, sizeof(str1)=100
strlen(str1)=53, sizeof(str1)=5
上面的运行结果,strlen(str1)=53显然不对,53是没有意义的。C语言中,sizeof和strlen都是表示字符串长度的吗?谁能告诉我它们两者的区别~~ - 已解决 - 搜狗问问
C语言中,sizeof和strlen都是表示字符串长度的吗?谁能告诉我它们两者的区别~~
把是sizeof 是整个变量的大小 strlen 是字符串的大小(strlen 是首地址进行计数直至遇到'\0' 停止计数):如char buffer[50]="hello world";&&&&&& ("hello world"& d字符后会追加个'\0'字符)printf("%d, %d \n",sizeof(buffer),strlen(buffer));&结果为50, 11
sizeof 计算的是数据在内存中存放的长度,单位是“字节”,可以对任何数据类型做运算,而且它是一个运算符(和+、-、*、\类似);当对字符串计算时,包含末尾的"\0";当对字符数组操作时,返回的是数组的总的长度,也就是当把数组作为参数传递给sizeof时是不会退化的。strlen 计算的是字符串的长度,单位是“字符”,只能对字符串运算,而且它是函数(不是运算符),计算时,不包含末尾的"\0";当对字符数组操作时,返回的是数组总存放的字符串的实际长度(也就是\0之前的),也就是当把数组作为参数传递给strlen时是会退化成char*指针的。例如:char* str = "Hello!";sizeof(str)值为7;strlen(str)值为6;char str[20] = "Hello!";sizeof(str)值为20;strlen(str)值为6;char字符串数组与string之间的转换,以及sizeof,strlen,length的区别
windowsAPI中,许多函数字符串参数都是char字符串数组,但是觉得string真的用起来很方便,所以就要了解它们之间的转换。
char cr1[10]="abc";//字符串数组类型,是以'\0'结尾的,可写可不写,但是必须占一个字节。
'\0'就是asc码表的里面用0代表的字符,也就是null,(如:'\101'是A)。
string str1="abc";
char转string,string str2(cr1);
str2.append(cr1);//字符串添加到末尾
str2.assign(cr1);//字符串付给本串
string转char,str1.c_str();返回的是const
char *类型,所以是不能根据这个返回的指针来修改字符串内容的。
那么我们具体怎么应用呢,
可以先把str1.c_str()用sprintf()把字符串拷贝到一个新的char数组中,当然新的字符串数组的长度要比返回的字符串长度大。
既然说到长度,就要说说sizeof和strlen的区别了。
sizeof():判断数据类型长度符。如sizeof(int)或者sizeof(i)(/i是int类型的),结果都会是一个int类型的长度(1个字长),以字节为单位,32位的系统int就是4。
注意:除了数组的名字用来做参数是数组的长度之外,其他的,不管是什么指针什么类型,都是那个变量的长度。
比如sizeof(cr1)/sizeof(&cr1),就是10,意思就是这个数组类型的长度(不管里面有什么个字符)。
如果是char *
cp=cr1;siztof(cp);意思就是这个指针类型长度是多少。如果是sizeof(str1),那么就是string类型的长度,string是8个字长。
strlen():求的是char字符串的实际长度(string要转成char),它求得方法是从开始到遇到第一个'\0'(不包括'\0'),strlen(cr1),结果就是3。
string.length:返回实例中 Char
对象的个数
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 strlen char 的文章

 

随机推荐