赞
踩
众所周知,数组存储字母的时候,如果是一串字符,我们叫做字符串,使用双引号引用。
那么问题来了,为什么输出差别那么大呢?我们来看一下这三个arr的储存形式。
%c打印的时候会把ascll和字符相互转换就导致了出现乱码的问题,比如arr3中,%c并不知道4950515233320这个数字对应什么就会乱码。
%s打印的时候是直接打印字符一直到出现/0这个结束标志。
上面abc后面出现乱码就是这个原因,因为一直找不到/0这个结束标志,我们在c后面加一个\0就能解决问题!
以至于一个我们经常出现的问题(如下图)就是这个原因引起
于是兜兜转转就又回到了故事的开始,但是与上面刚开始出现的乱码不同,我们这时的乱码是正常的,因为我们限制%c只打印arr[0]的内容,%c又是根据ascll打印的(据下图),所以我们就会得到这三个正常的乱码。
---------------------------------------------------------------------------------------------------------------------------------
以上就是我们C语言%c与%s打印逻辑的全部内容,明白了这个,其他都是小问题!
---------------------------------------------------------------------------------------------------------------------------------
但是我们C语言该如何使用数组打印单个汉字呢?
如果我们使用%c打印那么就会乱码。因为C语言中,我们的汉字由两个字符组成,%c根据ascll码值只能识别数字来打印。例如上图的arr1,我们如果想要只打印”你“,就需要把arr1[0]和arr1[1]的ascll码值算出来然后合并,很明显我们的%c做不到。
我们使用%s可以打印出来汉字,但是局限性太大,(如下图)我们本质上是让%s打印所有的字符,然后在我们在汉字后面手动加入”\0“来让它检测到停止符号然后停止,但是这样做不能够实现数组的轮询,轮番逐字打印”你好!“,包括打印单个字的时候只能打印第一个,只打印第二个字就做不到。
那么我们该如何做呢?
我们可以使用二维数组来实现这个问题,使用%s让它完整打印一行直到\0,这个时候不会起冲突,因为理论上%s是完整的打印了整个一维数组。(如下图)
但是这个时候如果使用%c就会出现乱码,%c会把arr[0]的三个值算一起然后继续算出一个乱码来。
最后总结一下%c和%s的区别:
%c:字符型,把输入的数字按照ascll码相应替换。
%s:字符串,输出字符串中的字符,直至字符串中的\0
%c输出单个字符,%s输出字符串
未经允许,禁止转载--------------------------------------------------------------------------------
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。