程序调试中遇到问题:
在使用sprintf 函数,在转换字符串时,如果遇到0时,会自动认为是结束标志,0以后的内容不会被添加进来。
复习一下字符串:
一. ASCII码是什么?
ASCII 全称为 ( American Standard Code for Information Interchange),简单的说,就是用 7 位二进制去编码我们生活中常见的数字,大小写字母,标点符号以及一些特殊的控制字符,如下:
数字:0 , 1 , 2 , 3 ... 9
字母:a , b , c ...z , A , B , C ... Z
标点符号以及运算符:,. + - ...
控制字符:回车,换行等控制字符
ASCII 编码表部分截图如下 :
在 上述 ASCII 编码表里的第 5 列,都可称之为字符。
字符又分为:
控制字符或者通信专用字符 ( 0 ~ 31以及127)
可显示字符 ( 32 ~ 126 )
因此如果我们想要显示这些字符,我们只需要在存储其对应的编码值 ( 一般使用 16 进制,或者 10 进制),然后通过 printf 格式化输出得到我们想要的字符
#include
intmain(){charc1=0x48;//存储其十六进制
unsignedcharc2='e';//直接存储字符,但是本质上也是存储了其对应的编码值
shortc3=108;//存进十进制
intc4=108;//存进十进制
longc5=0157;//存进八进制
longlongc6='!';//同上
longlongc7='\r';//同上
longlongc8='\n';//同上
printf("%c",c1);printf("%c",c2);printf("%c",c3);printf("%c",c4);printf("%c",c5);printf("%c",c6);printf("%c",c7);printf("%c",c8);}
Hello!
从上面可以看出,上述的数据类型都可以使用,但是通常我们都用 char 来存储,因为他占用的内存大小刚好合适,不会浪费内存。
思考:为什么不用 unsigned char?
从上面的编码过程 我们就可以看出来,一个个储存过于麻烦,因此我们就可以用字符串进行存储 ,但是在c语言中没有字符串数据类型 ( string ),因此声明一个字符类型数组,或者无符号类型数组来存储字符串。
#include
#include
intmain(){unsignedcharstr1[]="Hello unsigned char!\r\n";//字符串
printf("%s",str1);charstr2[]="Hello char!\r\n";printf("%s",str2);}
Hellounsignedchar!Hellochar!
相同点
字符和字符串都可以用 char 和 unsigned char 数据类型进行存储
不同点
字符也可以用 整型类型 存储,但是字符串只能用 unsigned char 或 char 数据类型数组进行存储
字符存储时使用单引号 ' ' , 字符串使用双引号 “ ”
字符的格式化输出符号为 %c , 字符串的格式化输出符号为 %s
存单个字符时,字符占用1个字节,字符串占用两个字节,因为字符串总是以 '\0' 结尾,且\0 也占用一个内存空间
将字符存在字符类型的数组中,进行字符串的格式化输出。
#include
#include
intmain(){charstr1[]="Hello\r\n\0 world!";printf("%s",str1);charstr2[]={'H','e','l','l','o','\r','\n','\0','w','o','r','l','d'};printf("%s",str2);charstr3='H';printf("the size of str3 is %d\r\n",sizeof(str3));charstr4[]="H";printf("the size of str4 is %d\r\n",sizeof(str4));charstr5[]="He";printf("the size of str5 is %d\r\n",sizeof(str5));}
HelloHellothesizeof'H'is1thesizeof"H"is2thesizeof"He"is3
str1 中出现 \0 ,此时字符串输出结束,所以输出 Hello
str2 中出现 \0 ,此时字符串输出结束,所以输出 Hello
字符串结尾是 \0 ,也占用一个存储空间