strlen 订阅
strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。 [1] 展开全文
strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。 [1]
信息
返回值
给定字符串(不包括“\0”)长度
头文件
string.h(C)或cstring(C++)
格    式
strlen(字符指针表达式)
中文名
strlen
功    能
计算给定字符串的长度
实    质
C/C++语言函数
strlen函数原型
在Visual C++ 6.0或Dev-C++中,原型为,其中size_t实际上是unsigned int,在VC6.0或Dev-C++中可以看到这样的代码:头文件:string.h或cstring格式:strlen (字符指针表达式)功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内说明:返回s的长度,不包括结束符NULL。相关函数:
收起全文
精华内容
下载资源
问答
  • strlen

    千次阅读 2019-07-11 11:42:23
    strlen

    strlen计算长度

    strlen在计算长度时,一定要注意计算的字符串中是否含有\0字符(请注意,0和\0是有区别的,0代表数字,\0代表转义字符,值是48),比如你希望算0x1234056的长度,实际计算值strlen是7;如果是这类数据{‘1,’,‘2’,‘\0’, ‘3’},strlen计算出来就是2;这类数据{‘1,’,‘2’,’0’, ‘3’},strlen计算出来是4。
    注意:这里’\0’和’0’是有区别的,看ascii码对照表可以知道:
    在这里插入图片描述

    '\0’的十进制就是0,而’0’的十进制是48;

    另外,单说’\0’来说,它是一个字符,作为字符串结尾字符。它是一个字节大小,占8位。因为0x00是16进制,在内存中存放方式是:00000000,而在这8个0最后是一个‘\0’结束符,所以对于整个0x00来说,它在计算机内存中其实和’\0’的表示是一样的。所以在strlen到0x00最后一个0时便会结束,类似{0x1,0x02,0x00,0x03}得到的结果便是2。至于为什么数字0不会失败,因为数字0在内存中占4字节,32bit,而strlen在拷贝时是单字节拷贝,所以还遇不到0的最后一个结束符。

    展开全文
  • Strlen

    千次阅读 2017-07-20 09:43:27
    strlen (C语言函数)  strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器...

    strlen C语言函数) 

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


    中文名

    strlen

    头文件

    string.h

        

    strlen 字符数组名)

        

    计算给定字符串的长度

        

    C语言函数

    目录




    函数原型

    编辑

    extern unsigned int strlen(char *s);

    Visual C++ 6.0中,原型为size_t strlen(const char *string); ,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t;

    头文件string.h

    格式:strlen字符数组名)

    功能:计算给定字符串的(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中运行通过)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    #include<string.h>

    #include<stdio.h>

    int main(void)

    {

        char*s="GoldenGlobalView";

        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(此处不完全正确,结果可能是不定的,如果编译器将其他的非零字符串放在aa[10]的内存地址后,strlen结果还是不定的,MSP430IAR编译测试过)(但是在vc6中结果为3,编译器会在处自动添上\0。)

    char aa[5]="hello";cout<<strlen(aa)<<endl; //结果5(此处不完全正确,理由如上,因为实际内存中,hello后面不一定是空(即\0))(还应视编译器而定)

    sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个取字节运算符,strlen是函数。

    sizeof(aa) 返回10

    int a[10]; sizeof(a) 返回40 (根据语言int c/c++由编译器决定是两个或四个 java是四个)

    sizeof操作符的结果类型是size_t,它在头文件中typedefunsigned 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";

    long 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返回字符个数. //正确

    在使用strlen时,有一个很特别的情况,就是数组名到指针蜕变,

    char Array[3] = {'0'};

    sizeof(Array) == 3;

    char *p = Array;

    strlen(p) == 1;//sizeof(p)结果为4

    在传递一个数组名到一个函数中时,它会完全退化为一个指针

    ----------------------------------------------------------

    看完以上你是否很清楚sizeofstrlen的区别了呢?还不明白的话,我们看下面几个例子:




    第一个例子

    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;

    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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    #include<stdio.h>

    #include<assert.h>

    typedefunsignedintu_int;

    u_intMystrlen(constchar*str){

    u_inti;

    assert(str!=NULL);

    for(i=0;str[i]!='\0';i++);

    returni;

    }

    2

    1

    2

    3

    4

    5

    6

    7

    intstrlen(constchar*str){

    assert(str!=NULL);

    intlen=0;

    while((*str++)!='\0')

    len++;

    returnlen;

    }

    3

    1

    2

    3

    4

    5

    6

    intstrlen(constchar*str){

    assert(str);

    constchar*p=str;

    while(*p++!=NULL);

    returnp-str-1;

    }

    4

    1

    2

    3

    4

    5

    6

    7

    intstrlen(constchar*str){

    assert(str);

    if(*str==NULL)

    return0;

    else

    return1+strlen(++str));

    }

    5

    1

    2

    3

    4

    5

    6

    /***strlen-Findthelengthofastring*@s:Thestringtobesized*/

    size_tstrlen(constchar*s){

    constchar*sc;

    for(sc=s;*sc!='\0';++sc)/*nothing*/;

    returnsc-s;

    }

    以上各种实现的方式都是大同小异的,有的用的是变量,有的用的是指针

    其中,最后一个用的是递归的方式。其实,在实现库函数的时候,是规定不可以

    调用其他的库函数的,这里只是给大家一个方法,可以不用变量就可以实现strlen



    展开全文
  • 主要介绍了php中strlen和mb_strlen用法,结合实例形式分析了strlen和mb_strlen针对中英文结合字符编码计算字符串长度的操作技巧,需要的朋友可以参考下
  • 在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别。 下面通过例子,讲解这两者之间的区别。 先看例子: <?php //测试时文件的编码方式要是UTF8 ...
  • strlen函数的使用与模拟实现strlen

    千次阅读 2021-03-03 22:11:26
    strlen函数的简单运用与模拟实现 strlen函数的简单运用与模拟实现strlen函数的简单使用strlen函数的三种模拟实现使用临时变量的方法使用函数递归的方法使用指针相减的方法 strlen函数的简单使用 strlen函数是用来...

    strlen函数的简单运用与模拟实现

    strlen函数的简单使用

    strlen函数是用来计算字符串长度的一个函数,返回类型是size_t
    
    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char arr[] = "hello world";
    	size_t;//返回值是size_t unsigned int
    	int len = strlen(arr);
    	printf("len=%d\n", len);
    	return 0;
    }
    
    
    下面就是对于返回值类型是size_t的一个很形象的例子
    
    int main()
    {
    	const char* p1 = "abc";
    	const char* p2 = "adbcdef";
    	if (strlen(p1) - strlen(p2) > 0)
    		//因为返回值是无符号数,所以没有负数
    	{
    		printf("hehe");
    	}
    	else
    	{
    		printf("haha");
    	}
    	return 0;
    }
    
    

    strlen函数的三种模拟实现

    使用临时变量的方法

    #include<stdio.h>
    #include<assert.h>
    //模拟实现strlen
    size_t my_strlen(const char* str)
    {
    	int count = 0;//计数器
    	assert(str != NULL);
    	//断言不是空指针,如果没有这步,当是空指针的时候可能会崩溃
    	while (*str != '\0')
    	{
    		count++;
    		str++;
    	}
    	return count;
    }
    int main()
    {
    	char arr[] = "hello";
    	int len = my_strlen(arr);
    	printf("%d\n", len);
    	return 0;
    }
    

    使用函数递归的方法

    #include<stdio.h>
    #include<assert.h>
    //不使用临时变量
    size_t my_strlen(const char* str)
    {
    	assert(str != NULL);
    	if (*str != '\0')
    	{
    		return 1 + my_strlen(str + 1);
    	}
    	else
    	{
    		return 0;
    	}
    }
    int main()
    {
    	char arr[] = "hello";
    	int len = my_strlen(arr);
    	printf("%d\n", len);
    	return 0;
    }
    

    使用指针相减的方法

    //指针相减的做法
    size_t my_strlen(const char* str)
    {
    	assert(str != NULL);
    	const char* start = str;
    	//str 不能初始化char类型,所以用const
    	while (*str != '\0')
    	{
    		str++;
    	}
    	return str - start;
    }
    int main()
    {
    	char arr[] = "hello";
    	int len = my_strlen(arr);
    	printf("%d\n", len);
    	return 0;
    }
    
    展开全文
  • Strlen函数

    千次阅读 2020-04-07 10:14:36
    strlen函数的函数原型 size_t strlen( const char *string ); 由strlen函数的原型可以看出,strlen函数的返回值类型为size_t类型 strlen函数的调用 #include<stdio.h> #include<string.h> int main()...
    strlen函数的函数原型
    size_t strlen( const char *string );
    
    • 由strlen函数的原型可以看出,strlen函数的返回值类型为size_t类型
    strlen函数的调用
    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char arr1[] = "abcdef";
    	char arr2[] = "abc";
    	if (strlen(arr2) - strlen(arr1)>0)
    		printf("arr2>arr1");
    	else
    		printf("arr2<arr1");
    	return 0;
    }
    
    • 上述代码的返回结果为arr2>arr1,在我们一般看来,strlen(arr2)的结构为3,strlen(arr1)的结果为6,那么显而易见的就是,arr2<arr1,那么打印出来的结果为什么会是arr2>arr1呢?
    • 原因在于:由库函数的函数原型可以看出,strlen函数的返回值类型是size_t类型的,也就是说,是无符号的整形,那么本身的话,3-6的值是-3,是一个负数,但是两个无符号数进行相减的结果肯定也是一个无符号数,那么当-3被看成是无符号数来对待的话,他就是一个数值非常大的正数了,那么打印的结果是arr2>arr1也就不奇怪了,因为arr2-arr1的返回值是一个正数。
    注意:strlen函数的返回值类型是size_t类型的
    • 但是,一般在模拟实现的时候,我都会把strlen函数的返回值类型给成是int类型的。其实,strlen函数的返回值给成int类型还是给成size_t类型都是说的过去的。如果给成size_t类型的话,合理就合理在返回值不要是负数的,但是,如果给成size_t类型的话,有时候也是会出现一些错误的,比如说上面的哪个代码,从实际上来看,arr2的长度是要小于arr1的长度的,但是打印出来的结果却是arr2>arr1。如果给成int类型,那当然也是可以了,而且不会那么容易出错。
    strlen函数的模拟实现
    • 计数器方法
    #include<stdio.h>
    #include<assert.h>
    int my_strlen(const char* str)
    {
    	int count = 0;
    	assert(str);
    	while (*str != '\0')
    	{
    		count++;
    		str++;
    	}
    	return count;
    }
    int main()
    {
    	char arr[] = "hello world";
    	int len = my_strlen(arr);
    	printf("%d", len);
    	return 0;
    }
    
    • 递归方法
    #include<stdio.h>
    #include<assert.h>
    int my_strlen(const char* str)
    {
    	assert(str);
    	if (*str == '\0')
    		return 0;
    	else
    		return 1 + my_strlen(str + 1);
    }
    int main()
    {
    	char arr[] = "hello world";
    	int len = my_strlen(arr);
    	printf("%d", len);
    	return 0;
    }
    
    • 指针-指针
    #include<stdio.h>
    #include<assert.h>
    int my_strlen(char* str)
    {
    	assert(str);
    	char* x = str;
    	while (*str++ != '\0')
    	{
    		;
    	}
    	return str - x - 1;
    }
    int main()
    {
    	char arr[] = "hello world";
    	int len = my_strlen(arr);
    	printf("%d", len); 
    	return 0;
    }
    
    • 三目运算符+递归
    #include<stdio.h>
    #include<assert.h>
    int my_strlen(const char* str)
    {
    	assert(str);
        return !(*str) ? 0 : 1 + my_strlen(str + 1);
    }
    int main()
    {
        char arr[] = "hello world";
        int len= my_strlen(arr);
        printf("%d\n", len);
        return 0;
    }
    
    strlen函数的注意事项
    • 字符串需要以\0作为结束的标志,strlen函数返回的是在字符串中\0前面出现的字符个数,不包括\0
    • 参数指向的字符串必须要以\0作为结束的标志,不然的话,返回值将是未知的。
    • 函数的返回值是size_t
    • strlen函数的模拟实现
    展开全文
  • 在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别
  • 比较strlen和mb_strlen 当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。(测试时编码方式是UTF8) 复制代码 代码如下:<?php $str=‘中文a字1符‘; echo strlen($str)...
  • 在php中常见的计算字符串长度的函数有:strlen和mb_strlen.当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。 在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于...
  • strlen实现 模拟实现库函数strlen #include<stdio.h> #include<assert.h> //模拟实现库函数strlen int my_strlen(const char* str){ int count = 0; assert(str != NULL); while (*str != '\0'){ ...
  • strlen与mb_strlen

    2018-07-07 10:43:48
    strlen计算中,对待一个UTF8的中文字符,处理为3个字节长度 当mb_strlen的内码选择为UTF-8的时候,则会将中文字符当成一个字符,英文也当做一个字符 mb_strlen($str, 'utf-8'),当不选择编码方式时,一个中文还是3...
  • strlen和mb_strlen区别

    2019-05-17 17:43:00
    strlen和mb_strlen都是用于获取字符串长度的; strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数, 如果是多字节码编码,如gbk和utf8,使用strlen得到的不是字符的个数,而是该字符的总字节数, ...
  • 分别实现strlenstrlenstrlen,strcmp,strstr,memcpy //1.实现strlen //2.实现strlen //3.实现strlen //4.实现strcmp //5.实现strstr //6.实现memcpy //实现strlen(求字符串长度) size_t Strlen...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,842
精华内容 15,536
热门标签
关键字:

strlen