打印
[匠人手记]

本来是放在“字符串”内的东东,偏要拿出来单独“**”

[复制链接]
12024|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序匠人|  楼主 | 2009-3-12 00:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
匠人今天看到这样一条语句:
while(*ddata!='\0') DisplayOneChar_LCD(x++,y,*ddata++);

匠人没有用过,也没有见过这个'\0',凭直觉理解,这个'\0'应该是用于判断字符串数组是否结束。不过,还是不太了解原理,连忙上网去搜索。要说吧现在有了网络确实是好,什么难题都可以在网上找到答案。

原来,在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。 

'\0'就是 字符串结束标志。

比如说,把一个字符串赋值给数组:
u8 str1[]={"cxjr.21ic.org"};
实际上数组str1在内存中的实际存放情况为: 
c x j r . 2 1 i c . o r g '\0' 
这后面的'\0'是由C编译系统自动加上的。所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。 
把字符数组str1中的字符串拷贝到字符数组str2中。串结束标志'\0'也一同拷贝。 

但是……也有一些例外情况发生。
比如,当数组长度不够。假设我们指定了数组长度,如:
u8 str1[13]={"cxjr.21ic.org"};
由于字符组str1的长度为13,所以后面的信息会丢失,即'\0'丢失。

另外,如果在给数组赋值时,把每个字符单独用引号括起来。也会丢失'\0'。如:
u8 str1[]={'c','x','j','r','.','2','1','i','c','.','o','r','g'};
如果希望数组以'\0'结束,则要么写成:
u8 str1[]={"cxjr.21ic.org"};
要么写成(人工添加'\0'):
u8 str1[]={'c','x','j','r','.','2','1','i','c','.','o','r','g','\0'};
要么写成(故意给数组预留一个空位):
u8 str1[14]={'c','x','j','r','.','2','1','i','c','.','o','r','g'};

相关帖子

沙发
computer00| | 2009-3-12 00:33 | 只看该作者

晕...\0其实就是0啦~~~直接写个0就行了~~~写个\0是浪费表情...

其实在C语言里面的字符串中,\是转意字符,后面可以跟一个八进制的数字,就表示这个值~~~

例如你要显示A,A的ASCII码是65,换算成八进制就是101,你可以写成"\101",结果就输出一个A给你...
要输出一个回车换行,就是"\015\012"拉~~~~~当然,要产生一个字符串结束符0,就是\0了。

俺写字符串输出程序一般是

while(*p)   //搞个  *p!='\0'  看着就不舒服,结果都是一样的,\0就是0。
{
 PutChar(*p);
 p++;
}

使用特权

评论回复
板凳
程序匠人|  楼主 | 2009-3-12 00:42 | 只看该作者

从可阅读性来说,匠人觉得还是写成“*p!='\0'”更好些

对于while(*p):   这样很难理解,其实是把条件隐藏了。如果象匠人这样的c菜鸟,要是第一次看到这么个语句,一定看不懂。

而对于 while(“*p!='\0'):虽然匠人很菜,但至少能猜测其大概作用。
   
虽然结果都是一样的,\0就是0。但是匠人觉得还是规范点好。

使用特权

评论回复
地板
computer00| | 2009-3-12 00:46 | 只看该作者

我晕...这样容易让初学者误解字符串结束符是个什么特殊的

其实圈圈觉得,一开始就要让他们搞清楚字符串是用数值0结束的,字符是用其它数值表示的,他们都存在内存中,
这样才更能深入理解计算机。很多人对指针什么的觉得头晕,也是这个原因。直接判断它是否为0不是很简单么?为0就结束了。

使用特权

评论回复
5
xwj| | 2009-3-12 00:54 | 只看该作者

唉,匠人实在是一大堆错误,建议你先去编译下再来说!!


PS:
赞同圈圈,老x判断结束符也都是用0x00,偶尔偷懒可能会直接写成0
而从来都不会用什么'\0',这不是吃饱了撑的脱裤子放气吗?

使用特权

评论回复
6
平常人| | 2009-3-12 00:58 | 只看该作者

哈哈,0代表圈圈,匠人非要拿根棍子在后面打

圈圈当然不高兴了,匠人这是强人所难呀,呵呵。。。。。。。。。。

使用特权

评论回复
7
computer00| | 2009-3-12 01:22 | 只看该作者

呵呵,匠人单引号和双引号不分...双引号是字符串,会在后

单引号就一个字符,多了不行哦...

使用特权

评论回复
8
程序匠人|  楼主 | 2009-3-12 08:25 | 只看该作者

昨夜匆忙,没有注意单引号和双引号之分

睡觉前翻了一下C教材。发现错误。但电脑已经关了。呵呵,还是被你们发现了。赶紧去改正。

使用特权

评论回复
9
程序匠人|  楼主 | 2009-3-12 08:32 | 只看该作者

补充一些材料

§7.3 字符数组
用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。
7.3.1 字符数组的定义 
定义的方法与前面介绍的类似,如: char c[3];
c[0]=’b’; c[1]=’m’;c[2]=’u’;
由于字符型与整型是互相通用的,因此上面的定义也可改为 int c[3];
7.3.2 字符数组的初始化
对字符数组的初始化就是逐个字符赋给数组中各元素。如:static char c[3]={’b’,’m’,’u’}; 如果花括弧中提供的初值个数大于数组长度,则作语法错误处理,如果花括弧中提供的初值个数小于数组长度,则其余的元素自动定为空字符。
7.3.3 字符数组的引用
可以引用数组中的一个元素,得到一个字符。
例:输出一个字符串。
void main(void )
{ static char c[8] = {’c’,’o’, ’m’,’p’, ’u’,’t’, ’e’,’r’};
int i;
for(i=0;i<10;i++)
printf("%c",c);
printf("\n");
}
运行结果: computer
7.3.4 字符串和字符串结束标志
为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符‘\0’代表。如果有一个字符串,其第10个字符为‘\0’,则此字符串的有效字符为9个。即遇到字符‘\0’时,表示字符串结束,由它前面的字符组成字符串。系统对字符串常量自动加一个‘\0’作为结束符。因此对字符串的可以写成:
static char c[ ]= "computer"
需要说明的是:字符数组并不要求它的最后一个字符为’\0’,但是只要用字符串常量就会自动加上一个’\0’。因此人们为了便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组中常常认为地加上一个’\0’,如:
static char c[6]={’c’,’h’,’i’, ’n’,’a’,’ \0’,};
7.3.5 字符数组的输入和输出
有两种方法:
  1. 逐个字符输入输出。用格式符”%c” 输入或输出一个字符。如: 
    static char c[8] = {’c’,’o’, ’m’,’p’, ’u’,’t’, ’e’,’r’};
  2. 将整个字符串一次输入或输出。用”%s”格式符。如:static char c[6]={ "china"}; 
[BLOCKQUOTE]
printf("%s",c);[/BLOCKQUOTE]
 
注意:
  1. 输出字符不包括结束符’\0’。 
  2. 用”%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。这样是错误的:printf("%s",c[0]); 
  3. 如果数组长度大于字符串实际长度,也只输出到遇’\0’ 结束。 
  4. 如果一个字符数组包含一个以上’\0’,则遇到第一个’\0’ 时输出结束。 
  5. scanf 函数中的输入项是字符数组名,不要在加地址符。如:scanf("%s",c); 

 
7.3.6 字符串处理函数
在C的函数库中提供了一些用来处理字符串的函数,下面介绍几种常用的函数:
  1. strcat(字符数组1,字符数组2) 
    连接两个字符数组中的字符串,把串2放到串1的后面,结果放到字符数组1中,这要求字符数组1足够大。如:static char c1[3]={ "chi"};
    static char c2[2]={ "na"};
    printf("%s", strcat(c 1,c 2) ); 输出:china
  2. strcpy(字符数组1,字符串2) 作用是将字符串2拷贝到字符数组1中。 
  3. strcmp(字符串1,字符串2) 作用是比较字符串1和字符串2。比较的结果由函数值带回。如果两个字符串相等,函数值为0;如果字符串1>字符串2, 函数值为一正整数;如果字符串1 <字符串2, 函数值为一负整数。 
  4. strlen(字符数组) 作用是测试字符串长度的函数,函数值为字符串中实际长度。 
  5. strlwr(字符串) 作用是将字符串中的大写字母转换成小写字母。 
  6. strupr(字符串) 作用是将字符串中的小写字母转换成大写字母。 
  7. puts(字符数组) 作用是将一个字符串输出到终端。 
  8. gets(字符数组) 作用是从终端输入一个字符串到字符数组。 

 
7.3.7 字符数组应用举例
例:输入一行字符,统计其中有多少个单词,单词之间用空格隔开。
#include "stdio.h"
void main(void )
{ char string[81];
int i,num = 0,word = 0;
char c;
gets(string);
for(i=0;(c=string )!=’\0’;i++)
if(c= =’ ’) word=0;
else if(word= =0)
{ word=1;
num++ 
} 算法如上图 
printf("There are %d words in the line\n",num);
}
运行情况如下:
I am a boy. ↙
There are 4 words in the line

使用特权

评论回复
10
程序匠人|  楼主 | 2009-3-12 08:35 | 只看该作者

哦,想起来了,圈圈就是两个'00'

 平常人 发表于 2009-3-12 00:58 匠人手记 ←返回版面    

6楼: 哈哈,0代表圈圈,匠人非要拿根棍子在后面打 

圈圈当然不高兴了,匠人这是强人所难呀,呵呵。。。。。。。。。。 
 
---------------
哈哈,怪不得,原来圈圈早就已经把那根棍子给咔嚓掉啦,就剩下两个00了。欧耶!

使用特权

评论回复
11
computer00| | 2009-3-12 10:09 | 只看该作者

哎,真是误人子弟的教材...

C语言里字符串结束符明明就是数值0,而写教材的人偏偏要玩花样,说什么特殊符号'\0',这明摆着是忽悠人的...

另外,字符数组通常其实就是一个8位数据类型的普通数组,可以存放任意值。只有把它当作字符串处理时,
0就作为字符串结束符处理。其它的非0数值统统当作有效字符处理。

使用特权

评论回复
12
HWM| | 2009-3-12 10:15 | 只看该作者

本来是放在“字符串”内的东东,偏要拿出来单独“**”

使用特权

评论回复
13
程序匠人|  楼主 | 2009-3-12 13:26 | 只看该作者

背景资料


美国标准信息交换标准码 
( American Standard Code for Information Interchange, ASCII ) 

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机比较傻,只有0和1两位数的二进制比较适合于它使用),同样的,象a、b、c、d这样的52个字母(包括大写)、以及0、1、2等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪个数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通讯而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ASCII编码,统一规定了上述常用符号用哪个二进制数来表示。 
美国标准信息交换代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。 
ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中: 
0~32及127(共34个)是控制字符或通讯专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。 
33~126(共94个)是字符,其中48~57为0到9十个阿拉伯数字; 
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。 
同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 
后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。以下为标准ASCII表: 

Bin Dec Hex 缩写/字符 解释 
0000 0000 0 00 NUL (null) 空字符 
0000 0001 1 01 SOH (start of handing) 标题开始 
0000 0010 2 02 STX (start of text) 正文开始 
0000 0011 3 03 ETX (end of text) 正文结束 
0000 0100 4 04 EOT (end of transmission) 传输结束 
0000 0101 5 05 ENQ (enquiry) 请求 
0000 0110 6 06 ACK (acknowledge) 收到通知 
0000 0111 7 07 BEL (bell) 响铃 
0000 1000 8 08 BS (backspace) 退格 
0000 1001 9 09 HT (horizontal tab) 水平制表符 
0000 1010 10 0A LF (NL line feed, new line) 换行键 
0000 1011 11 0B VT (vertical tab) 垂直制表符 
0000 1100 12 0C FF (NP form feed, new page) 换页键 
0000 1101 13 0D CR (carriage return) 回车键 
0000 1110 14 0E SO (shift out) 不用切换 
0000 1111 15 0F SI (shift in) 启用切换 
0001 0000 16 10 DLE (data link escape) 数据链路转义 
0001 0001 17 11 DC1 (device control 1) 设备控制1 
0001 0010 18 12 DC2 (device control 2) 设备控制2 
0001 0011 19 13 DC3 (device control 3) 设备控制3 
0001 0100 20 14 DC4 (device control 4) 设备控制4 
0001 0101 21 15 NAK (negative acknowledge) 拒绝接收 
0001 0110 22 16 SYN (synchronous idle) 同步空闲 
0001 0111 23 17 ETB (end of trans. block) 传输块结束 
0001 1000 24 18 CAN (cancel) 取消 
0001 1001 25 19 EM (end of medium) 介质中断 
0001 1010 26 1A SUB (substitute) 替补 
0001 1011 27 1B ESC (escape) 溢出 
0001 1100 28 1C FS (file separator) 文件分割符 
0001 1101 29 1D GS (group separator) 分组符 
0001 1110 30 1E RS (record separator) 记录分离符 
0001 1111 31 1F US (unit separator) 单元分隔符 

0010 0000 32 20 空格 
0010 0001 33 21 ! 
0010 0010 34 22 " 
0010 0011 35 23 # 
0010 0100 36 24 $ 
0010 0101 37 25 % 
0010 0110 38 26 & 
0010 0111 39 27 ' 
0010 1000 40 28 ( 
0010 1001 41 29 ) 
0010 1010 42 2A * 
0010 1011 43 2B + 
0010 1100 44 2C , 
0010 1101 45 2D - 
0010 1110 46 2E . 
0010 1111 47 2F / 
0011 0000 48 30 0 
0011 0001 49 31 1 
0011 0010 50 32 2 
0011 0011 51 33 3 
0011 0100 52 34 4 
0011 0101 53 35 5 
0011 0110 54 36 6 
0011 0111 55 37 7 
0011 1000 56 38 8 
0011 1001 57 39 9 
0011 1010 58 3A : 
0011 1011 59 3B ; 
0011 1100 60 3C < 
0011 1101 61 3D = 
0011 1110 62 3E > 
0011 1111 63 3F ? 
0100 0000 64 40 @ 

0100 0001 65 41 A 
0100 0010 66 42 B 
0100 0011 67 43 C 
0100 0100 68 44 D 
0100 0101 69 45 E 
0100 0110 70 46 F 
0100 0111 71 47 G 
0100 1000 72 48 H 
0100 1001 73 49 I 
0100 1010 74 4A J 
0100 1011 75 4B K 
0100 1100 76 4C L 
0100 1101 77 4D M 
0100 1110 78 4E N 
0100 1111 79 4F O 
0101 0000 80 50 P 
0101 0001 81 51 Q 
0101 0010 82 52 R 
0101 0011 83 53 S 
0101 0100 84 54 T 
0101 0101 85 55 U 
0101 0110 86 56 V 
0101 0111 87 57 W 
0101 1000 88 58 X 
0101 1001 89 59 Y 
0101 1010 90 5A Z 
0101 1011 91 5B [ 
0101 1100 92 5C \ 
0101 1101 93 5D ] 
0101 1110 94 5E ^ 
0101 1111 95 5F _ 
0110 0000 96 60 ` 

0110 0001 97 61 a 
0110 0010 98 62 b 
0110 0011 99 63 c 
0110 0100 100 64 d 
0110 0101 101 65 e 
0110 0110 102 66 f 
0110 0111 103 67 g 
0110 1000 104 68 h 
0110 1001 105 69 i 
0110 1010 106 6A j 
0110 1011 107 6B k 
0110 1100 108 6C l 
0110 1101 109 6D m 
0110 1110 110 6E n 
0110 1111 111 6F o 
0111 0000 112 70 p 
0111 0001 113 71 q 
0111 0010 114 72 r 
0111 0011 115 73 s 
0111 0100 116 74 t 
0111 0101 117 75 u 
0111 0110 118 76 v 
0111 0111 119 77 w 
0111 1000 120 78 x 
0111 1001 121 79 y 
0111 1010 122 7A z 
0111 1011 123 7B { 
0111 1100 124 7C | 
0111 1101 125 7D } 
0111 1110 126 7E ~ 

0111 1111 127 7F DEL (delete) 删除 
另外还有128-255的ASCII字符 
字符集简史 
6000年前 象形文字 
3000年前 字母表 
1838年到1854年 Samuel F. B. Morse发明了电报,字母表中的每个字符对应于一系列短的和长的脉冲 
1821年到1824年 Louis Braille发明盲文,6位代码,它把字符、常用字母组合、常用单字和标点进行编码。 
一个特殊的escape代码表示后续的字符代码应解释为大写。一个特殊的shift代码允许后续代码被解释为数字。 
1931年 CCITT标准化Telex代码,包括Baudot #2的代码,都是包括字符和数字的5位代码。 
1890年 早期计算机的字符码是从Hollerith卡片,6位字符码系统BCDIC(Binary-Coded Decimal Interchange Code:二进制编码十进制交换编码) 
60年代 扩展为8位EBCDIC,IBM大型主机的标准 
1967年 美国信息交换标准码(ASCII:American Standard Code for Information Interchange) 
在字符长度是6位、7位还是8位的问题上产生了很大的争议。从可靠性的观点来看不应使用替换字符, 
因此ASCII不能是6位编码,但由于费用的原因也排除了8位版本的方案(当时每位的储存空间成本仍很昂贵)。 
这样,最终的字符码就有26个小写字母、26个大写字母、10个数字、32个符号、33个句柄和一个空格,总共128个字符码。 
ASCII现在记录在ANSI X3.4-1986字符集-用于信息交换的7位美国国家标准码(7-Bit ASCII:7-Bit American National 
Standard Code for Information Interchange),由美国国家标准协会(American National Standards Institute)发布。 
图2-1中所示的ASCII字符码与ANSI文件中的格式相似。 



ASCII国际问题 
ASCII是美国标准,所以它不能良好满足其它讲英语国家的需要。例如英国的英镑符号(£)在哪里? 
拉丁语字母表重音符号 
使用斯拉夫字母表的希腊语、希伯来语、阿拉伯语和俄语。 
汉字系统的中国象形汉字,日本和朝鲜。 

1967年,国际标准化组织(ISO:International Standards Organization)推荐一个ASCII的变种, 
代码0x40、0x5B、0x5C、0x5D、0x7B、0x7C和0x7D“为国家使用保留”,而代码0x5E、0x60和0x7E标为 
“当国内要求的特殊字符需要8、9或10个空间位置时,可用于其它图形符号”。这显然不是一个最佳的国际解决方案, 
因为这并不能保证一致性。但这却显示了人们如何想尽办法为不同的语言来编码的。 

扩展ASCII 
1981年 IBM PC ROM256个字符的字符集,即IBM扩展字符集 
1985年11 Windows字符集被称作“ANSI字符集”,遵循了ANSI草案和ISO标准(ANSI/ISO 8859-1-1987,简“Latin 1”。 
ANSI字符集的最初版本: 
1987年4月代码页437,字符的映像代码,出现在MS-DOS 3.3 


双字节字符集 
双字节字符集(DBCS:double-byte character set),解决中国、日本和韩国的象形文字符和ASCII的某种兼容性。 
DBCS从256代码开始,就像ASCII一样。与任何行为良好的代码页一样,最初的128个代码是ASCII。 
然而,较高的128个代码中的某些总是跟随着第二个字节。 
这两个字节一起(称作首字节和跟随字节)定义一个字符,通常是一个复杂的象形文字。 

NUL VT 垂直制表 SYN 空转同步 
SOH 标题开始 FF 走纸控制 ETB 信息组传送结束 
STX 正文开始 CR 回车 CAN 作废 
ETX 正文结束 SO 移位输出 EM 纸尽 
EOY 传输结束 SI 移位输入 SUB 换置 
ENQ 询问字符 DLE 空格 ESC 换码 
ACK 承认 DC1 设备控制1 FS 文字分隔符 
BEL 报警 DC2 设备控制2 GS 组分隔符 
BS 退一格 DC3 设备控制3 RS 记录分隔符 
HT 横向列表 DC4 设备控制4 US 单元分隔符 
LF 换行 NAK 否定 DEL 删除 

键盘常用ASCII码 
ESC键 VK_ESCAPE (27) 
回车键: VK_RETURN (13) 
TAB键: VK_TAB (9) 
Caps Lock键: VK_CAPITAL (20) 
Shift键: VK_SHIFT () 
Ctrl键: VK_CONTROL (17) 
Alt键: VK_MENU (18) 
空格键: VK_SPACE (/32) 
退格键: VK_BACK (8) 
左徽标键: VK_LWIN (91) 
右徽标键: VK_LWIN (92) 
鼠标右键快捷键:VK_APPS (93) 
Insert键: VK_INSERT (45) 
Home键: VK_HOME (36) 
Page Up: VK_PRIOR (33) 
PageDown: VK_NEXT (34) 
End键: VK_END (35) 
Delete键: VK_DELETE (46) 
方向键(←): VK_LEFT (37) 
方向键(↑): VK_UP (38) 
方向键(→): VK_RIGHT (39) 
方向键(↓): VK_DOWN (40) 
F1键: VK_F1 (112) 
F2键: VK_F2 (113) 
F3键: VK_F3 (114) 
F4键: VK_F4 (115) 
F5键: VK_F5 (116) 
F6键: VK_F6 (117) 
F7键: VK_F7 (118) 
F8键: VK_F8 (119) 
F9键: VK_F9 (120) 
F10键: VK_F10 (121) 
F11键: VK_F11 (122) 
F12键: VK_F12 (123) 
Num Lock键: VK_NUMLOCK (144) 
小键盘0: VK_NUMPAD0 (96) 
小键盘1: VK_NUMPAD0 (97) 
小键盘2: VK_NUMPAD0 (98) 
小键盘3: VK_NUMPAD0 (99) 
小键盘4: VK_NUMPAD0 (100) 
小键盘5: VK_NUMPAD0 (101) 
小键盘6: VK_NUMPAD0 (102) 
小键盘7: VK_NUMPAD0 (103) 
小键盘8: VK_NUMPAD0 (104) 
小键盘9: VK_NUMPAD0 (105) 
小键盘.: VK_DECIMAL (110) 
小键盘*: VK_MULTIPLY (106) 
小键盘+: VK_MULTIPLY (107) 
小键盘-: VK_SUBTRACT (109) 
小键盘/: VK_DIVIDE (111) 
Pause Break键: VK_PAUSE (19) 
Scroll Lock键: VK_SCROLL (145)
本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn ,本贴地址:http://bbs.zdnet.com.cn/viewthread.php?tid=485354



使用特权

评论回复
14
HWM| | 2009-3-12 13:32 | 只看该作者

字符串用NULL收尾是C的规范,其它语言(如PASCAL)并非如此。

使用特权

评论回复
15
computer00| | 2009-3-12 16:52 | 只看该作者

PASCAL好象开头就是存储的字符串长度...有点类似结构体了

使用特权

评论回复
16
HWM| | 2009-3-12 16:53 | 只看该作者

没错

使用特权

评论回复
17
平常人| | 2009-3-13 23:19 | 只看该作者

物理存储上'\0'和0没有区别,但在数据类型上这两个不等价

'\0'是char类型,而0默认是int类型。

使用'\0'不会出现默认的类型转换,而使用0则会被编译器做类型转换。

对于某些要求严格的编译器,开放了通常所说的强类型检测功能时,在应该使用'\0'的地方使用了0时,编译器会报警(warning)。

PASCAL就是强类型检测语言。


看样子匠人现在开始恶补C语言啦,哈哈。。。。

使用特权

评论回复
18
程序匠人|  楼主 | 2009-3-21 14:09 | 只看该作者

恶补谈不上,临阵磨枪,不快也光。欧耶!

使用特权

评论回复
19
三块石头| | 2009-3-29 21:49 | 只看该作者

同意17楼平常人

'\0' 和 0 在内存当中存放时确实是一样的,但对数据的解释却不一样,也就是17楼说的数据结构意义上不一样

我们为什么要发明汇编语言(助记符)来代替机器码,不就是因为增强可读性,并且强化同一数据在计算机中的不同解释么,所以如果认为'\0'和0一样,那咱干啥不用机器码编程呢……?呵呵,矫情了

if( *p != '\0' )表示*p和一个字符比较
if( *p != 0)表示*p和一个整型常量比较
从可读性角度讲,也应该尽量使用'\0'

使用特权

评论回复
20
victor3l| | 2012-5-7 14:26 | 只看该作者
那么如何判断一串汉字的结束符了?,请大家帮帮忙!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

734

主题

11156

帖子

678

粉丝