zoukankan      html  css  js  c++  java
  • sizeof()和lstrlen()和strlen()区别

    strlen()是返回字符串的字节长度,   
    lstrlen()是返回字符串的字符长度。   
    也就是说第二个函数可能和第一个函数结果一样,如果字符串中字符单位都是单字节的话。   
        
    一般来说主要区别在于ascii的字符,还是unicode或者是utf的区别。
    ASCII编码是一个字符占一个字节,Unicode是一个字符占两个字节.求这两种字符串的长度,要用两个函数分别来.
    lstrlen(),strlen()用来操作字符串或字符数组,lstrlen(),strlen()是在程序运行后得到字符串长度 
    sizeof()可以操作任何类行   
    sizeof()由编译器计算得到  

    lstrlen   used   for   unicode   
    strlen     used   for   ansi   
    sizeof     编译器分配memory大小

    lstrlen
      函数功能:该函数返回指定字符串的字节长度(ANSI版)或字符长度(双字节标准版);其中不包括终止NULL字符。
      函数原型:int lstrlen(LPCTSTR lpString);
      参数:lpString:指向以NULL为终止符的字符串。
      返回值:返回值是指定字符串中字节(ANSI版)或字符(双字节标准版)的长度。

    strlen

    原型:extern unsigned int strlen(char *s);,在Visual C++ 6.0中,原型为size_t strlen( const char *string );,其中size_t实际上是长整型long。
      头文件:string.h
      功能:计算字符串s的(unsigned int型)长度
      说明:返回s的长度,不包括结束符NULL。

    strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到''停止。
      char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
      char aa[10]={''}; 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
      1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
      该类型保证能容纳实现所建立的最大对象的字节大小。
      2.sizeof是操作符(关键字),strlen是函数。
      3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''''结尾的。
      sizeof还可以用函数做参数,比如:
      short f();
      printf("%d ", 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 的时候,通常是计算字符串数组的长度
      看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
      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'};
      sizeof(Array) == 3;
      char *p = Array;
      sizeof(p) == 1;//sizeof(p)结果为4
      在传递一个数组名到一个函数中时,它会完全退化为一个指针

  • 相关阅读:
    sublime text 4 vim 插件配置
    ssh-keygen 的使用
    distribution transaction solution
    bilibili 大数据 视频下载 you-get
    Deepin 20.2.1 安装 MS SQL 2019 容器版本
    【转】使用Linux下Docker部署MSSQL并加载主机目录下的数据库
    【转】You Can Now Use OneDrive in Linux Natively Thanks to Insync
    dotnet 诊断工具安装命令
    Linux 使用 xrandr 设置屏幕分辨率
    【转】CentOS 7.9 2009 ISO 官方原版镜像下载
  • 原文地址:https://www.cnblogs.com/qiangge-blog/p/4874953.html
Copyright © 2011-2022 走看看