countof,sizeof,strlen(),size(),length()的区别学习&& 字符串中’/0’的问题

字符串中’/0’的问题

C++中没有字符串对象,字符串可以看成是字符数组。
字符串和数组的区别:

  • 在最后的一个元素"\0"上,它标志着一串字符是否是字符串。
    (在内存中,就是根据"\0"来确认字符串,如果找不到就会沿着字符一直找下去。它占用内存空间,但是不计入串长。)
  • 用字符串初始化字符数组时,"\0"附带在后面与前面的字符一起作为字符数组的元素
    注意: 用字符串初始化字符数组时
    系统会在字符数组的末尾自动加上一个字符"\0",因此数组的大小比字符串中实际字符的个数 大。如:sizeof(str1)=strlen(str1) +1;
    如果是用字符初始化数组,则一定要把"\0"作为一个元素放在初始值表中,不然就不会成为一个字符串。
char sText[5];
  sText[0]='a';
  sText[1]='a';
  sText[2]='a';
  sText[3]='a';
  sText[4]='\0';
  cout<<sText<<endl;///cout对string输出时,会过滤掉空字符,输出不会被截断。
  //这样输出就是4个a
  // 如果数组的第五个元素即:
  sText[4]='a';
  cout<<sText<<endl; //这样输出就是5个a和一堆乱码,甚至跳出系统错误,因为没有字符串结尾符

(原:https://blog.csdn.net/jesse621/article/details/8033183#)

sizeof,strlen(),size(),length()的区别学习

strlen(),size(),length()用于求字符串的长度
sizeof用于求对象的字节大小

1. sizeof

注意:C语言中sizeof()是一个关键字,不是函数,不需要使用头文件,补足知识:
  1、跟int, float关键字一样,编译器自动识别他们;
  2、千万不要因为它长得像函数,就上它的当;
  3、就像getchar()的返回值是个int型而不是char型一样,C中有很多陷阱一样。
 
数组求长度,用sizeof(数组名)

int arr[] = {1, 2, 3, 4};

sizeof(arr) = 16;

char arr[] = "abc";

sizeof(arr) = 4;

strlen(arr)=3

char arr[] = {'1', '2', '3'};

sizeof(arr) = 3;

strlen(arr)=3

注意:当数组作为函数参数传递当时候,表示当是指针,不能用sizeof(名称),求出来当是计算机字长。

sizeof()计算数据(数组、变量、类型、结构体等)所占空间,用字节数表示。
sizeof是一个运算符,获得保证能容纳实现所建立的最大对象的字节大小。因为sizeof的值在编译时就计算好了,因此sizeof不能用来返回动态分配的内存空间的大小。
PS:关于结构体的sizeof日后补充。

2.strlen()

strlen()是一个函数,它的参数必须是一个字符指针,它返回的是字符串的长度,它跟sizeof在编译时就计算好不同,它是在运行之后才计算出来的。
函数声明

size_t strlen(const char *str)

函数功能:
从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’。返回的长度大小不包括’\0’.

参数

str – 要计算长度的字符串。

返回值

该函数返回字符串的长度,长度大小不包括'\0'.

3. size()和length()

注意:C++中string成员函数length()等同于size(),返回值包括‘/0’,与C库函数strlen()有着本质的区别,使用时切勿混淆。
这两个函数是用来计算string类对象的长度,假如有一个string对象str,则str.size()和str.length()会返回它们的长度,它们的作用是相同的
函数声明:

//返回string长度,单位字节
size_t length() const noexcept;
//返回string长度,单位字节。作用等同于length()
size_t size() const noexcept;

对比sizeof

和sizeof一样都返回加‘/0’,but!
sizeof()用于返回括号中的对象内存中分配的大小,这个对象有很多。
而size()和length():用于计算string对象长度的一个成员函数
例如size()函数,它包含在STL中,如下所示:

       string s="I love you";
       int t=s.size();        //t的值为10
       用起来非常的简洁明了。而length()的效果和它是完全一致的,不过它使用的历史更早''

4.countof:

是系统定义的一个宏,求取元素的数组的元素个数
详情在https://msdn.itellyou.cn/查到的。

宏_countof,很好用,作用是可以直接返回静态数组的元素个数。
MSDN上这么介绍这个宏的:

_countof宏:计算静态数组元素的个数。
用法:_countof(array);
所需头文件:<stdlib.h>

示例如下:
#define _UNICODE #include <stdio.h>#include <stdlib.h>#include <tchar.h>int main( void ){ _TCHAR arr[20], *p; printf( “sizeof(arr) = %d bytes/n”, sizeof(arr) ); printf( “_countof(arr) = %d elements/n”, _countof(arr) ); // In C++, the following line would generate a compile-time error: // printf( “%d/n”, _countof§ ); // error C2784 (because p is a pointer) _tcscpy_s( arr, _countof(arr), _T(“a string”) ); // unlike sizeof, _countof works here for both narrow- and wide-character strings}

在VS2005上面输出结果如下:
sizeof(arr) = 40 bytes
_countof(arr) = 20 elements
如果屏蔽掉#define _UNICODE 这句,那么输出结果又是:
sizeof(arr) = 20 bytes
_countof(arr) = 20 elements
(原文:https://blog.csdn.net/md521/article/details/5512836

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值