C中的字符数组

今天是五一的最后一天了,这个五一哪都没去,玩的也一般般,上午终于把那个数据结构的实验程序搞定了,说来真是惭愧,这么久了才弄完,主要是自己心思没用放在上面(这些天一直在玩游戏)。
这个实验程序大家应该都做过的就是那个魔王语言翻译的,通过这个程序又发现了自己程序设计的不少有待改进的地方,感受最深的是其中的字符数组使用的部分现在趁这个机会自己也好好总结下。
顾名思义字符数组就是用来存放字符数据的数组,其中一个元素存放一个字符。光这样说太枯燥了来看看这个程序吧:

#include <stdio.h>

#include <conio.h>
main()
{
char a[10],b[10];
int i;
clrscr();
gets(a);
for(i=0;a[i]!=’/0’;i++)
b[i]=a[i];
printf(“i=%d,blen=%d/n”,i,strlen(b));
puts(b);
getch();
}
大家都可以看出这是一个非常简单的程序,首先你认为这个程序有没有问题呢?当然这个程序的语法是没有任何错误的,但运行后的结果会是怎么样的呢?以下是我在tc2.0下的运行结果:
journey
i=7,blen=15
journey????????
上面的8个?是代表的乱码,为什么结果会是这样的呢,而且blen为什么是15呢?如果记得C中的字符数组的存放状态就不难理解了,C语言规定了一个字符串结束标志,以字符‘/0’代表。如果一个字符串,其中的第1个字符为‘/0’,则此字符串的有效字符为9个,也就是说,在遇到字符‘/0’,表示字符串结束,由它前面的字符组成字符串。系统对字符串常量自动加一个‘/0’作为结束符。‘/0’代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
上面程序中的字符数组a有标准输入终端输入系统会自动的加上一个‘/0’,而数组b是由a赋值的但是a并没有把‘/0’赋给它,由于它没有经过终端进行输入,系统是不会知道它什么时候该结束,所以不会自动给它加上,因此产生了上面的结果。如果在程序自己加上b[i]=’/0’,结果就是正确的了。