字符串数组结束符“\0“的使用探讨

来源:互联网 发布:网络歌手mv下载 编辑:程序博客网 时间:2024/05/21 06:49

今天在创建一个字符串串口连续发送函数的时候,在其中对字符串数组是否发送完进行判断,按照以前的惯性使用了这样一句:

while(*(str+cnt)!='\0')

{

       U0_Transmit(*(str+cnt++));

}

这样的写法想必很多人都写过,这也确实是判断一个字符串是否到了结束的好办法。不过更加细致地对其进行一下研究,有助于我们在使用字符串的这个特点时,能用得更好而不是畏手畏脚。

首先来对字符串常量进行一下介绍:

根据谭浩强的《C程序设计》来说,字符串常量是由一对双引号括起的字符序列,区别于字符常量的单引号。在C中,没有专门的数据类型用于存放字符串常量,但可以用字符数组存放一个字符串常量。这点是我们经常使用,但是容易疏忽的一点。再者就是其存储特点,首先字符串常量所占用的内存字节数等于字符创常量的字节数+1(C标准规定是这样,一般使用也是这样,当然也有特殊情况,即字符创常量结束无'\0')。下面来举例说明

将一个字符串常量赋给数组:

unsigned char str1[ ]={"hello,world!"};;

实际上,该字符数组str1在内存中的实际存放情况为: 
h e l l o , w o r l d !
这后面的'\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'};

通过这样的方式就可以避免在使用通过"\0"判断发送是否完毕的函数时陷入死循环了。

原创粉丝点击