srtlen实现以及与sizeof的比较
这里仅为个人整理,大部分来自百科
一、strlen函数
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
1、用法:
针对碰到第一个字符串结束'\0'为止的两点说明:
(1)见下例:
1 char a[10]={'\0'}; 2 cout<<strlen(a)<<endl; //结果为0
从开始到遇到一个'\0'为止。
(2)见下例:
1 char a[10]; 2 cout<<strlen(a)<<endl; //此处结果不定
从开始到遇到一个'\0'为止。
2、函数实现
1 /*递归版*/ 2 size_t strlen(const char *pStr) 3 { 4 assert(pStr !=NULL); 5 if(*pStr !='\0') 6 { 7 return 1+strlen(++pStr); 8 } 9 else 10 return 0; 11 } 12 13 /*非递归版*/ 14 size_t strlen(const char *pStr) 15 { 16 assert(pStr !=NULL); 17 size_t psize=0; 18 while(*pStr !='\0') 19 { 20 psize++; 21 pStr++; 22 } 23 rturn psize; 24 }
二、sizeof
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。sizeof( )返回的是变量声明后所占的内存数,不是实际长度。
1、这是一个依赖编译系统的值,头文件为stddef.h中,一般定义为:
1 typedef unsigned int size_t;
2、语法
1 sizeof(object); //sizeof(对象); 2 sizeof(type_name); //sizeof(类型); 3 sizeof object; //sizeof 对象;和第一行比少一个括号
三、strlen函数和sizeof的区别
(1)sizeof不是函数,仅仅是一个取字节运算符,strlen是函数;
(2)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的;
(3)数组做sizeof的参数不退化,传递给strlen就退化为指针了;
更多见百科。
区别举例:
(1)针对静态数组:
1 char str[20]="0123456789"; 2 int a=strlen(str); //a=10 3 int b=sizeof(str); //b=20;
(2)针对指针
1 char* ss = "0123456789"; //ss是指向字符串常量的字符指针 2 sizeof(ss) //结果 4,sizeof 获得的是一个指针的值所占的空间,应该是长整型的,所以是4 3 sizeof(*ss) //结果 1, *ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位 4 strlen(ss)= 10 //如果要获得这个字符串的长度,则一定要使用 strlen
注:从对比知,若想获得一个字符串的长度,一定要使用strlen