分享

C语言中字符串结束符'\0'的讨论

 changqiong0606 2012-07-04

'\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。在数值类型里就代表数字0。

数值类型存储时,最高位决定正负号,其他位都为0可不就是0了么?

'\0'是转译字符,意思是告诉程序,这不是字符0,我要的是数字0的2进制直接放进来,因为acsii码的0可不是00000000


原来,在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'};
/******************************************************************************************************************************************************/
http://bbs.21ic.com/icview-126610-1-1.html

§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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多