小贴士:关于'\0'字符串结束标志
匠人今天看到这样一条语句:<br />while(*ddata!='\0') DisplayOneChar_LCD(x++,y,*ddata++);<br /><br />匠人没有用过,也没有见过这个'\0',凭直觉理解,这个'\0'应该是用于判断字符串数组是否结束。不过,还是不太了解原理,连忙上网去搜索。要说吧现在有了网络确实是好,什么难题都可以在网上找到答案。<br /><br />原来,在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。 <br /><br />'\0'就是 字符串结束标志。<br /><br />比如说,把一个字符串赋值给数组:<br />u8 str1[]={"cxjr.21ic.org"};<br />实际上数组str1在内存中的实际存放情况为: <br />c x j r . 2 1 i c . o r g '\0' <br />这后面的'\0'是由C编译系统自动加上的。所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。 <br />把字符数组str1中的字符串拷贝到字符数组str2中。串结束标志'\0'也一同拷贝。 <br /><br />但是……也有一些例外情况发生。<br />比如,当数组长度不够。假设我们指定了数组长度,如:<br />u8 str1={"cxjr.21ic.org"};<br />由于字符组str1的长度为13,所以后面的信息会丢失,即'\0'丢失。<br /><br />另外,如果在给数组赋值时,把每个字符单独用引号括起来。也会丢失'\0'。如:<br />u8 str1[]={'c','x','j','r','.','2','1','i','c','.','o','r','g'};<br />如果希望数组以'\0'结束,则要么写成:<br />u8 str1[]={"cxjr.21ic.org"};<br />要么写成(人工添加'\0'):<br />u8 str1[]={'c','x','j','r','.','2','1','i','c','.','o','r','g','\0'};<br />要么写成(故意给数组预留一个空位):<br />u8 str1={'c','x','j','r','.','2','1','i','c','.','o','r','g'};<br /><br />晕...\0其实就是0啦~~~直接写个0就行了~~~写个\0是浪费表情...
其实在C语言里面的字符串中,\是转意字符,后面可以跟一个八进制的数字,就表示这个值~~~<br /><br />例如你要显示A,A的ASCII码是65,换算成八进制就是101,你可以写成"\101",结果就输出一个A给你...<br />要输出一个回车换行,就是"\015\012"拉~~~~~当然,要产生一个字符串结束符0,就是\0了。<br /><br />俺写字符串输出程序一般是<br /><br />while(*p) //搞个 *p!='\0' 看着就不舒服,结果都是一样的,\0就是0。<br />{<br /> PutChar(*p);<br /> p++;<br />}从可阅读性来说,匠人觉得还是写成“*p!='\0'”更好些
对于while(*p): 这样很难理解,其实是把条件隐藏了。如果象匠人这样的c菜鸟,要是第一次看到这么个语句,一定看不懂。<br /><br />而对于 while(“*p!='\0'):虽然匠人很菜,但至少能猜测其大概作用。<br /> <br />虽然结果都是一样的,\0就是0。但是匠人觉得还是规范点好。我晕...这样容易让初学者误解字符串结束符是个什么特殊的
其实圈圈觉得,一开始就要让他们搞清楚字符串是用数值0结束的,字符是用其它数值表示的,他们都存在内存中,<br />这样才更能深入理解计算机。很多人对指针什么的觉得头晕,也是这个原因。直接判断它是否为0不是很简单么?为0就结束了。唉,匠人实在是一大堆错误,建议你先去编译下再来说!!
<br />PS:<br />赞同圈圈,老x判断结束符也都是用0x00,偶尔偷懒可能会直接写成0<br />而从来都不会用什么'\0',这不是吃饱了撑的脱裤子放气吗?哈哈,0代表圈圈,匠人非要拿根棍子在后面打
圈圈当然不高兴了,匠人这是强人所难呀,呵呵。。。。。。。。。。呵呵,匠人单引号和双引号不分...双引号是字符串,会在后
单引号就一个字符,多了不行哦...昨夜匆忙,没有注意单引号和双引号之分
睡觉前翻了一下C教材。发现错误。但电脑已经关了。呵呵,还是被你们发现了。赶紧去改正。补充一些材料
<B>§7.3 字符数组</B><br />用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。<br /><B>7.3.1 字符数组的定义 </B><br />定义的方法与前面介绍的类似,如: char c;<br />c=’b’; c=’m’;c=’u’;<br />由于字符型与整型是互相通用的,因此上面的定义也可改为 int c;<br /><B>7.3.2 字符数组的初始化</B><br />对字符数组的初始化就是逐个字符赋给数组中各元素。如:static char c={’b’,’m’,’u’}; 如果花括弧中提供的初值个数大于数组长度,则作语法错误处理,如果花括弧中提供的初值个数小于数组长度,则其余的元素自动定为空字符。<br /><B>7.3.3 字符数组的引用</B><br />可以引用数组中的一个元素,得到一个字符。<br />例:输出一个字符串。<br />void main(void )<br />{ static char c = {’c’,’o’, ’m’,’p’, ’u’,’t’, ’e’,’r’};<br />int i;<br />for(i=0;i<10;i++)<br />printf("%c",c);<br />printf("\n");<br />}<br />运行结果: computer<br /><font color=#FF0000><B>7.3.4 字符串和字符串结束标志</B><br /></font><font color=#FF0000>为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符‘\0’代表。如果有一个字符串,其第10个字符为‘\0’,则此字符串的有效字符为9个。即遇到字符‘\0’时,表示字符串结束,由它前面的字符组成字符串。系统对字符串常量自动加一个‘\0’作为结束符。因此对字符串的可以写成:<br />static char c[ ]= "computer"<br />需要说明的是:字符数组并不要求它的最后一个字符为’\0’,但是只要用字符串常量就会自动加上一个’\0’。因此人们为了便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组中常常认为地加上一个’\0’,如:<br />static char c={’c’,’h’,’i’, ’n’,’a’,’ \0’,};<br /></font><B>7.3.5 字符数组的输入和输出</B><br />有两种方法:<OL><li>逐个字符输入输出。用格式符”%c” 输入或输出一个字符。如: <br />static char c = {’c’,’o’, ’m’,’p’, ’u’,’t’, ’e’,’r’};<li>将整个字符串一次输入或输出。用”%s”格式符。如:static char c={ "china"}; </li></OL><br />printf("%s",c);<br /><B> </B><B><br />注意:</B><OL><B></B><li>输出字符不包括结束符’\0’。 <li>用”%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。这样是错误的:printf("%s",c); <li>如果数组长度大于字符串实际长度,也只输出到遇’\0’ 结束。 <li>如果一个字符数组包含一个以上’\0’,则遇到第一个’\0’ 时输出结束。 <li>scanf 函数中的输入项是字符数组名,不要在加地址符。如:scanf("%s",c); </li></OL><br /><B> </B><br /><B>7.3.6 字符串处理函数</B><br />在C的函数库中提供了一些用来处理字符串的函数,下面介绍几种常用的函数:<OL><li>strcat(字符数组1,字符数组2) <br />连接两个字符数组中的字符串,把串2放到串1的后面,结果放到字符数组1中,这要求字符数组1足够大。如:static char c1={ "chi"};<br />static char c2={ "na"};<br />printf("%s", strcat(c 1,c 2) ); 输出:china<li>strcpy(字符数组1,字符串2) 作用是将字符串2拷贝到字符数组1中。 <li>strcmp(字符串1,字符串2) 作用是比较字符串1和字符串2。比较的结果由函数值带回。如果两个字符串相等,函数值为0;如果字符串1>字符串2, 函数值为一正整数;如果字符串1 <字符串2, 函数值为一负整数。 <li>strlen(字符数组) 作用是测试字符串长度的函数,函数值为字符串中实际长度。 <li>strlwr(字符串) 作用是将字符串中的大写字母转换成小写字母。 <li>strupr(字符串) 作用是将字符串中的小写字母转换成大写字母。 <li>puts(字符数组) 作用是将一个字符串输出到终端。 <li>gets(字符数组) 作用是从终端输入一个字符串到字符数组。 </li></OL><br /><B> </B><br /><B>7.3.7 字符数组应用举例</B><br />例:输入一行字符,统计其中有多少个单词,单词之间用空格隔开。<br />#include "stdio.h"<br />void main(void )<br />{ char string;<br />int i,num = 0,word = 0;<br />char c;<br />gets(string);<br />for(i=0;<font color=#FF0000>(c=string )!=’\0’</font>;i++)<br />if(c= =’ ’) word=0;<br />else if(word= =0)<br />{ word=1;<br />num++ <br />} 算法如上图 <br />printf("There are %d words in the line\n",num);<br />}<br />运行情况如下:<br />I am a boy. ↙<br />There are 4 words in the line哦,想起来了,圈圈就是两个'00'
平常人 发表于 2009-3-12 00:58 匠人手记 ←返回版面 <br /><br />6楼: 哈哈,0代表圈圈,匠人非要拿根棍子在后面打 <br /><br />圈圈当然不高兴了,匠人这是强人所难呀,呵呵。。。。。。。。。。 <br /> <br />---------------<br />哈哈,怪不得,原来圈圈早就已经把那根棍子给咔嚓掉啦,就剩下两个00了。欧耶!哎,真是误人子弟的教材...
C语言里字符串结束符明明就是数值0,而写教材的人偏偏要玩花样,说什么特殊符号'\0',这明摆着是忽悠人的...<br /><br />另外,字符数组通常其实就是一个8位数据类型的普通数组,可以存放任意值。只有把它当作字符串处理时,<br />0就作为字符串结束符处理。其它的非0数值统统当作有效字符处理。<br />本来是放在“字符串”内的东东,偏要拿出来单独“**”
背景资料
<br />美国标准信息交换标准码 <br />( American Standard Code for Information Interchange, ASCII ) <br /><br />在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机比较傻,只有0和1两位数的二进制比较适合于它使用),同样的,象a、b、c、d这样的52个字母(包括大写)、以及0、1、2等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪个数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通讯而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ASCII编码,统一规定了上述常用符号用哪个二进制数来表示。 <br />美国标准信息交换代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。 <br />ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中: <br />0~32及127(共34个)是控制字符或通讯专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。 <br />33~126(共94个)是字符,其中48~57为0到9十个阿拉伯数字; <br />65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。 <br />同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 <br />后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。以下为标准ASCII表: <br /><br />Bin Dec Hex 缩写/字符 解释 <br />0000 0000 0 00 NUL (null) 空字符 <br />0000 0001 1 01 SOH (start of handing) 标题开始 <br />0000 0010 2 02 STX (start of text) 正文开始 <br />0000 0011 3 03 ETX (end of text) 正文结束 <br />0000 0100 4 04 EOT (end of transmission) 传输结束 <br />0000 0101 5 05 ENQ (enquiry) 请求 <br />0000 0110 6 06 ACK (acknowledge) 收到通知 <br />0000 0111 7 07 BEL (bell) 响铃 <br />0000 1000 8 08 BS (backspace) 退格 <br />0000 1001 9 09 HT (horizontal tab) 水平制表符 <br />0000 1010 10 0A LF (NL line feed, new line) 换行键 <br />0000 1011 11 0B VT (vertical tab) 垂直制表符 <br />0000 1100 12 0C FF (NP form feed, new page) 换页键 <br />0000 1101 13 0D CR (carriage return) 回车键 <br />0000 1110 14 0E SO (shift out) 不用切换 <br />0000 1111 15 0F SI (shift in) 启用切换 <br />0001 0000 16 10 DLE (data link escape) 数据链路转义 <br />0001 0001 17 11 DC1 (device control 1) 设备控制1 <br />0001 0010 18 12 DC2 (device control 2) 设备控制2 <br />0001 0011 19 13 DC3 (device control 3) 设备控制3 <br />0001 0100 20 14 DC4 (device control 4) 设备控制4 <br />0001 0101 21 15 NAK (negative acknowledge) 拒绝接收 <br />0001 0110 22 16 SYN (synchronous idle) 同步空闲 <br />0001 0111 23 17 ETB (end of trans. block) 传输块结束 <br />0001 1000 24 18 CAN (cancel) 取消 <br />0001 1001 25 19 EM (end of medium) 介质中断 <br />0001 1010 26 1A SUB (substitute) 替补 <br />0001 1011 27 1B ESC (escape) 溢出 <br />0001 1100 28 1C FS (file separator) 文件分割符 <br />0001 1101 29 1D GS (group separator) 分组符 <br />0001 1110 30 1E RS (record separator) 记录分离符 <br />0001 1111 31 1F US (unit separator) 单元分隔符 <br /><br />0010 0000 32 20 空格 <br />0010 0001 33 21 ! <br />0010 0010 34 22 " <br />0010 0011 35 23 # <br />0010 0100 36 24 $ <br />0010 0101 37 25 % <br />0010 0110 38 26 & <br />0010 0111 39 27 ' <br />0010 1000 40 28 ( <br />0010 1001 41 29 ) <br />0010 1010 42 2A * <br />0010 1011 43 2B + <br />0010 1100 44 2C , <br />0010 1101 45 2D - <br />0010 1110 46 2E . <br />0010 1111 47 2F / <br />0011 0000 48 30 0 <br />0011 0001 49 31 1 <br />0011 0010 50 32 2 <br />0011 0011 51 33 3 <br />0011 0100 52 34 4 <br />0011 0101 53 35 5 <br />0011 0110 54 36 6 <br />0011 0111 55 37 7 <br />0011 1000 56 38 8 <br />0011 1001 57 39 9 <br />0011 1010 58 3A : <br />0011 1011 59 3B ; <br />0011 1100 60 3C < <br />0011 1101 61 3D = <br />0011 1110 62 3E > <br />0011 1111 63 3F ? <br />0100 0000 64 40 @ <br /><br />0100 0001 65 41 A <br />0100 0010 66 42 B <br />0100 0011 67 43 C <br />0100 0100 68 44 D <br />0100 0101 69 45 E <br />0100 0110 70 46 F <br />0100 0111 71 47 G <br />0100 1000 72 48 H <br />0100 1001 73 49 I <br />0100 1010 74 4A J <br />0100 1011 75 4B K <br />0100 1100 76 4C L <br />0100 1101 77 4D M <br />0100 1110 78 4E N <br />0100 1111 79 4F O <br />0101 0000 80 50 P <br />0101 0001 81 51 Q <br />0101 0010 82 52 R <br />0101 0011 83 53 S <br />0101 0100 84 54 T <br />0101 0101 85 55 U <br />0101 0110 86 56 V <br />0101 0111 87 57 W <br />0101 1000 88 58 X <br />0101 1001 89 59 Y <br />0101 1010 90 5A Z <br />0101 1011 91 5B [ <br />0101 1100 92 5C \ <br />0101 1101 93 5D ] <br />0101 1110 94 5E ^ <br />0101 1111 95 5F _ <br />0110 0000 96 60 ` <br /><br />0110 0001 97 61 a <br />0110 0010 98 62 b <br />0110 0011 99 63 c <br />0110 0100 100 64 d <br />0110 0101 101 65 e <br />0110 0110 102 66 f <br />0110 0111 103 67 g <br />0110 1000 104 68 h <br />0110 1001 105 69 i <br />0110 1010 106 6A j <br />0110 1011 107 6B k <br />0110 1100 108 6C l <br />0110 1101 109 6D m <br />0110 1110 110 6E n <br />0110 1111 111 6F o <br />0111 0000 112 70 p <br />0111 0001 113 71 q <br />0111 0010 114 72 r <br />0111 0011 115 73 s <br />0111 0100 116 74 t <br />0111 0101 117 75 u <br />0111 0110 118 76 v <br />0111 0111 119 77 w <br />0111 1000 120 78 x <br />0111 1001 121 79 y <br />0111 1010 122 7A z <br />0111 1011 123 7B { <br />0111 1100 124 7C | <br />0111 1101 125 7D } <br />0111 1110 126 7E ~ <br /><br />0111 1111 127 7F DEL (delete) 删除 <br />另外还有128-255的ASCII字符 <br />字符集简史 <br />6000年前 象形文字 <br />3000年前 字母表 <br />1838年到1854年 Samuel F. B. Morse发明了电报,字母表中的每个字符对应于一系列短的和长的脉冲 <br />1821年到1824年 Louis Braille发明盲文,6位代码,它把字符、常用字母组合、常用单字和标点进行编码。 <br />一个特殊的escape代码表示后续的字符代码应解释为大写。一个特殊的shift代码允许后续代码被解释为数字。 <br />1931年 CCITT标准化Telex代码,包括Baudot #2的代码,都是包括字符和数字的5位代码。 <br />1890年 早期计算机的字符码是从Hollerith卡片,6位字符码系统BCDIC(Binary-Coded Decimal Interchange Code:二进制编码十进制交换编码) <br />60年代 扩展为8位EBCDIC,IBM大型主机的标准 <br />1967年 美国信息交换标准码(ASCII:American Standard Code for Information Interchange) <br />在字符长度是6位、7位还是8位的问题上产生了很大的争议。从可靠性的观点来看不应使用替换字符, <br />因此ASCII不能是6位编码,但由于费用的原因也排除了8位版本的方案(当时每位的储存空间成本仍很昂贵)。 <br />这样,最终的字符码就有26个小写字母、26个大写字母、10个数字、32个符号、33个句柄和一个空格,总共128个字符码。 <br />ASCII现在记录在ANSI X3.4-1986字符集-用于信息交换的7位美国国家标准码(7-Bit ASCII:7-Bit American National <br />Standard Code for Information Interchange),由美国国家标准协会(American National Standards Institute)发布。 <br />图2-1中所示的ASCII字符码与ANSI文件中的格式相似。 <br /><br /><br /><br />ASCII国际问题 <br />ASCII是美国标准,所以它不能良好满足其它讲英语国家的需要。例如英国的英镑符号(£)在哪里? <br />拉丁语字母表重音符号 <br />使用斯拉夫字母表的希腊语、希伯来语、阿拉伯语和俄语。 <br />汉字系统的中国象形汉字,日本和朝鲜。 <br /><br />1967年,国际标准化组织(ISO:International Standards Organization)推荐一个ASCII的变种, <br />代码0x40、0x5B、0x5C、0x5D、0x7B、0x7C和0x7D“为国家使用保留”,而代码0x5E、0x60和0x7E标为 <br />“当国内要求的特殊字符需要8、9或10个空间位置时,可用于其它图形符号”。这显然不是一个最佳的国际解决方案, <br />因为这并不能保证一致性。但这却显示了人们如何想尽办法为不同的语言来编码的。 <br /><br />扩展ASCII <br />1981年 IBM PC ROM256个字符的字符集,即IBM扩展字符集 <br />1985年11 Windows字符集被称作“ANSI字符集”,遵循了ANSI草案和ISO标准(ANSI/ISO 8859-1-1987,简“Latin 1”。 <br />ANSI字符集的最初版本: <br />1987年4月代码页437,字符的映像代码,出现在MS-DOS 3.3 <br /><br /><br />双字节字符集 <br />双字节字符集(DBCS:double-byte character set),解决中国、日本和韩国的象形文字符和ASCII的某种兼容性。 <br />DBCS从256代码开始,就像ASCII一样。与任何行为良好的代码页一样,最初的128个代码是ASCII。 <br />然而,较高的128个代码中的某些总是跟随着第二个字节。 <br />这两个字节一起(称作首字节和跟随字节)定义一个字符,通常是一个复杂的象形文字。 <br /><br />NUL VT 垂直制表 SYN 空转同步 <br />SOH 标题开始 FF 走纸控制 ETB 信息组传送结束 <br />STX 正文开始 CR 回车 CAN 作废 <br />ETX 正文结束 SO 移位输出 EM 纸尽 <br />EOY 传输结束 SI 移位输入 SUB 换置 <br />ENQ 询问字符 DLE 空格 ESC 换码 <br />ACK 承认 DC1 设备控制1 FS 文字分隔符 <br />BEL 报警 DC2 设备控制2 GS 组分隔符 <br />BS 退一格 DC3 设备控制3 RS 记录分隔符 <br />HT 横向列表 DC4 设备控制4 US 单元分隔符 <br />LF 换行 NAK 否定 DEL 删除 <br /><br />键盘常用ASCII码 <br />ESC键 VK_ESCAPE (27) <br />回车键: VK_RETURN (13) <br />TAB键: VK_TAB (9) <br />Caps Lock键: VK_CAPITAL (20) <br />Shift键: VK_SHIFT () <br />Ctrl键: VK_CONTROL (17) <br />Alt键: VK_MENU (18) <br />空格键: VK_SPACE (/32) <br />退格键: VK_BACK (8) <br />左徽标键: VK_LWIN (91) <br />右徽标键: VK_LWIN (92) <br />鼠标右键快捷键:VK_APPS (93) <br />Insert键: VK_INSERT (45) <br />Home键: VK_HOME (36) <br />Page Up: VK_PRIOR (33) <br />PageDown: VK_NEXT (34) <br />End键: VK_END (35) <br />Delete键: VK_DELETE (46) <br />方向键(←): VK_LEFT (37) <br />方向键(↑): VK_UP (38) <br />方向键(→): VK_RIGHT (39) <br />方向键(↓): VK_DOWN (40) <br />F1键: VK_F1 (112) <br />F2键: VK_F2 (113) <br />F3键: VK_F3 (114) <br />F4键: VK_F4 (115) <br />F5键: VK_F5 (116) <br />F6键: VK_F6 (117) <br />F7键: VK_F7 (118) <br />F8键: VK_F8 (119) <br />F9键: VK_F9 (120) <br />F10键: VK_F10 (121) <br />F11键: VK_F11 (122) <br />F12键: VK_F12 (123) <br />Num Lock键: VK_NUMLOCK (144) <br />小键盘0: VK_NUMPAD0 (96) <br />小键盘1: VK_NUMPAD0 (97) <br />小键盘2: VK_NUMPAD0 (98) <br />小键盘3: VK_NUMPAD0 (99) <br />小键盘4: VK_NUMPAD0 (100) <br />小键盘5: VK_NUMPAD0 (101) <br />小键盘6: VK_NUMPAD0 (102) <br />小键盘7: VK_NUMPAD0 (103) <br />小键盘8: VK_NUMPAD0 (104) <br />小键盘9: VK_NUMPAD0 (105) <br />小键盘.: VK_DECIMAL (110) <br />小键盘*: VK_MULTIPLY (106) <br />小键盘+: VK_MULTIPLY (107) <br />小键盘-: VK_SUBTRACT (109) <br />小键盘/: VK_DIVIDE (111) <br />Pause Break键: VK_PAUSE (19) <br />Scroll Lock键: VK_SCROLL (145)<br />本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn ,本贴地址:http://bbs.zdnet.com.cn/viewthread.php?tid=485354<br /><br /><br /><br />字符串用NULL收尾是C的规范,其它语言(如PASCAL)并非如此。
PASCAL好象开头就是存储的字符串长度...有点类似结构体了
没错
物理存储上'\0'和0没有区别,但在数据类型上这两个不等价
'\0'是char类型,而0默认是int类型。<br /><br />使用'\0'不会出现默认的类型转换,而使用0则会被编译器做类型转换。<br /><br />对于某些要求严格的编译器,开放了通常所说的强类型检测功能时,在应该使用'\0'的地方使用了0时,编译器会报警(warning)。<br /><br />PASCAL就是强类型检测语言。<br /><br /><br />看样子匠人现在开始恶补C语言啦,哈哈。。。。恶补谈不上,临阵磨枪,不快也光。欧耶!
同意17楼平常人
'\0' 和 0 在内存当中存放时确实是一样的,但对数据的解释却不一样,也就是17楼说的数据结构意义上不一样<br /><br />我们为什么要发明汇编语言(助记符)来代替机器码,不就是因为增强可读性,并且强化同一数据在计算机中的不同解释么,所以如果认为'\0'和0一样,那咱干啥不用机器码编程呢……?呵呵,矫情了<br /><br />if( *p != '\0' )表示*p和一个字符比较<br />if( *p != 0)表示*p和一个整型常量比较<br />从可读性角度讲,也应该尽量使用'\0' 那么如何判断一串汉字的结束符了?,请大家帮帮忙!
页:
[1]
2