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 !=nullptr);
 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 !=nullptr);
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 

时间: 2024-11-09 02:05:24

srtlen实现以及与sizeof的比较的相关文章

【C++基础】sizeof 与 strlen的区别

要理解两者的区别,就要分别理解他们的本质 strlen(char *) 计算字符串的长度,内部实现是用一个循环计算字符串的长度,直到‘\0’为止 1.srtlen 是一个函数,参数只能为char 或者 string (sizeof是运算符,可以对好多类型作sizeof,如struct, class等) 2.对数组作sizeof不退化为指针,传递给strlen就退化为指针 3. char ss[100]="012345467"; cout << strlen(ss) <

关于malloc和sizeof的用法

问题1: 1.L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 2.newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); 其中L是已经定义的线性表,LIST_INIT_SIZE是线性表存储空间的初始分配量,listsize是当前分配的存储容量(以sizeof(ElemType)为单位) 解释: 第一个句子:用ma

sizeof strlen strncpy

sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 int main() 5 { 6 char *p="wangddd"; 7 printf("%d\n",sizeof(p));//输出4,指针类型 8 9 char x[8]; 10 printf("%d

关于sizeof的那些事

一 结构体 先上代码: struct A { int a; double d; char b; short c; }; 以上代码的sizeof(struct A)为24.分析: a占用4字节,由于d占用8字节,且d需要在8字节处对齐,因此a不仅有4字节存放内容,并且占另外的4个字节使得d位于8字节处.由于c需要在2字节处对齐,所以b占用了2个字节,c占用两个字节,目前总共是20字节,但是整个结构体A根据最大字节对齐,因此为8字节对齐,为了使得类型位struct A的数组的下一个元素处于正确的对齐

C++字符串使用sizeof时注意

char tmp1[20] = {"hello,你好"}; char tmp2[] = {"hello,你好"}; char *tmp3 = new char[20]; sprintf(tmp3,"%s","hello,你好"); string tmp4 = "hello,你好"; printf("%d %d %d %d\n",sizeof(tmp1),sizeof(tmp2),size

含有虚函数的类sizeof大小

#include <iostream> using namespace std; class Base1{ virtual void fun1(){} virtual void fun11(){} public: virtual ~Base1(); }; class Base2{ virtual void fun2(){} }; class DerivedFromOne: public Base2 { virtual void fun2(){} virtual void fun22(){} }

程序猿之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)

主要内容:段错误.类型提升.sizeof  'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; int *p = (int *)&(u.a[1]); // 没有引起总线错误 *p = 17; printf("%d\n",*p); #if 0 int *q = 0; // 引起段错误,在linux中运行可看到段错误,在windows下运行时直接出错 *q = 1; #endif

sizeof 和类继承 虚继承 求类大小

代码: #include <iostream> using namespace std; /* class a{ float k; // 4字节 virtual void foo(){} //有一个4字节的指针指向自己的虚函数表 }; class b : virtual public a{ virtual void f(){} }; 有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节:还要包括类a的字节数,所以类b的字节数就求出来了. 运行结果: 8 16 */ /* clas

宽字符std::wstring的长度和大小问题?sizeof(std::wstring)是固定的32,说明std::wstring是一个普通的C++类,而且和Delphi不一样,没有负方向,因为那个需要编译器的支持

std::wstring ws=L"kkkk";    int il=ws.length();    int ia=sizeof(ws);    int ib=sizeof("dddd");    int ic=sizeof(L"kkkk");输出为    il=4,ia=32,ib=5,ic=10为什么ia=32 ?wstring到底对L"kkkk"做了什么? http://www.debugease.com/vc/2171