C之有趣-strlen()函数引发的一场“血案”

亲爱的小伙伴们,大家都知道strlen()函数是求字符串长度的一款利器啊!
举个例子:int *str=”China”; 该字符串在内存中是这样的:C h i n a \0 那么很显然strlen(str)的值就是5;没错,这是因为strlen()函数求得是字符串的实际长度,也就是有效字符长度。而常常被我们拿来与之对比的sizeof(),它并不是一个函数,而是一个运算符。它所求的是所占字节的大小,也就是说sizeof(str)的值是6而不是5。
那么,到底strlen()函数判断字符串有效长度的机制或依据是什么了?
之前,在写一个小程序时我遇到了这么一个问题:当我输入一个长整型数字后,将其以字符形式保存起来,然后输出,同时区分正负。
然而,正当我得意洋洋的认为自己已经出色的完成了这个小程序的时候,出乎我意料的事情发生了。
这里写图片描述

在提示下,我输入一个6位数,而结果也正如期待的那样,看起来一切都很顺利,而当我输入一个7位数时,意外的事情发生了:

这里写图片描述

莫名其妙的出现了一些符号。
我非常不解,然后分析了源代码。我定义了一个容量为100的字符数组str[100],然后把num[0]作为符号位——要么是+、要么是–.之后,把数字的每一位倒序存放在数组中,最后输出符号位、倒序输出余下字符。

                     当我输入一个123456时,num[7]处刚好是个\0,因此,strlen(num)-1==6正好是要输出的字符个数,所以输出正确

这里写图片描述

而当我输入1234567时,num[8]不是\0,num[14]为\0,因此,strlen(num)-1==13,并不等于我们要输出字符的个数。输出结果中便有一些杂乱字符
这里写图片描述

这里写图片描述

由图可知,当我查看字符数组num中的数据后我发现了问题的根源,同时也明白了一件事——strlen()函数是以第一个\0作为字符串的有效字符结束标志。 同时,这个错误的最大根源在于——一个字符数组在被定义而未被初始化时,其值是无法预测的。因此我要将其初始化为‘0’。
进一步分析可知:
当我们输入一个字符串时,字符数组会在最后一个字符后面的元素赋为’\0’,作为此字符串的结束标志。
这里写图片描述
此时,我们输入字符串hellokitty最后面字符为y,后面以\0结束,在后面是\367\377
我们输入字符串hellokittyy,多的字符y占据了之前\0的位置,而系统又原来的\367的位置赋为\0.
这里写图片描述

接下来我们进行单个字符的赋值。 但我们进行单个字符的赋值时,字符数组中最后一个输入的字符后面就不会自动赋为’\0’. 我们依次输入字符w h a t a r e y o u
这里写图片描述
                                                                                                               很显然,最后的字符u后面不是\0,而是\377\177.
我们输入w h a t a r e y o u K
这里写图片描述 此时,\377被K占据,而\177并没有被赋为\0.

在下菜鸟一只,才疏学浅,错误恐难以避免。若各位小伙伴们,发现错误或有更好的想法,还望留言告知,在下将万分感谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值