C/C++中字符串数组及strlen()和sizeof()区别

1. 字符串数组

  标准C语言中没有字符串(string)类型,而只是在C++后添加了字符串string类,但是并不属于基础数据类型,只是类功能很强大,得到广泛应用。所以一般我们平时处理字符串,即字符序列,使用的都是字符串数组。

1.1 字符串数组定义

char nzArr1[6] = {'C','h','i','n','a','\0'};//‘\0’是字符串结束符
char nzArr2[10]= {'C','h','i','n','a'};//数组未初始化的索引位,系统自动补上'\0',即后5位都是'\0'。

  或者:

char nzArr[] = "China"; //字符串常量最后隐含'\0'

  这块需要注意几种赋初值方式的差异:

char nzArr1[ ]    = {'C','h','i','n','a'};
char nzArr2[ ]    = "China"; 
char nzArr3[6]    = {'C','h','i','n','a'};
printf("%d\n",sizeof(nzArr1));  //结果为5
printf("%d\n",sizeof(nzArr2));  //结果为6
printf("%d\n",sizeof(nzArr3));  //结果为6

  sizeof()计算的是类型或者变量的内存大小。
  nzArr1没有指定数组大小,所以计算以初始化值个数为准。由于char类型所占内存为1个字节,所有计算结果为5。注意以数组初始化形式赋初值不会自动补字符串结束符’\0’。
  nzArr2虽然也没有指定内存空间大小,但是以字符串形式赋初值,字符串常量本身就隐含了’\0’在结尾,所以计算结果为6。
  nzArr3指定了数组大小,除去初始化的,未初始化的索引位系统会默认初始化为’\0’。

1.2 字符串数组赋值问题

  我们直接看下面程序:

char nzArr[6];
nzArr = {'1','2'};//错误

  注意字符串数组初始化和正常赋值的区别。字符串数组不可以整体赋值,只能单个位单个位赋值,即:

char nzArr[6];
nzArr[0] = '1';
nzArr[2] = '2';

  同样的道理,哪怕两个字符串数组长度相同,也不可以互相整体赋值,只能通过引用元素单个位单个位赋值,例如:

char c1[6];
char c2[6] = "hello";
c1 = c2; //错误,不能整体赋值

2. strlen()和sizeof()区别

  sizeof()只是计算类型或者变量内存大小的关键字,不是函数,没有所谓的头文件包含,就是C/C++的一个操作符。编译器自动识别,并且在编译阶段就自动计算了sizeof()的值。
  strlen()是系统(string.h/cstring)头文件中定义的,用来计算以’\0’结尾的字符串长度的函数。它并不是计算内存大小,仅计算字符串从开端到’\0’结尾字符的个数(不包含’\0’)。并且只有在程序运行到strlen()函数地方,才运算统计字符串长度的结果。
  例如:

char nzArr[10]="China";
int  nNum     =strlen(str); //结果为5
int  nLenb    =sizeof(str); //结果为10

  也就是说sizeof()只跟你给该字符串数组定义了多大空间有关,而跟字符串是否结束无关。
  所以当输入一行字符串,在不知道字符个数的时候,可以用strlen()函数来计算字符串长度,而sizeof()则不行。例如:

char str[100];
cin.getline(str,100); //获得流中一行输入的前100个字符,不足100到'\0结束'
int nLen = strlen(str);//得到实际字符串长度
int nNum = sizeof(str);//与输入字符串无关,都是字符串内存大小100

个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:CSDN 无鞋童鞋。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值