欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 【时时三省】(C语言基础)字符数组

【时时三省】(C语言基础)字符数组

2025/5/12 14:21:26 来源:https://blog.csdn.net/2301_81226734/article/details/147876197  浏览:    关键词:【时时三省】(C语言基础)字符数组

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

字符型数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节。由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中的一种。

由于字符数据的应用较广泛,尤其是作为字符串形式使用,有其自己的特点。

C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的。

怎样定义字符数组

用来存放字符数据的数组是字符数组。在字符数组中的一个元素内存放一个字符。定义字符数组的方法与定义数值型数组的方法类似。例如:

char c [ 10 ];

c [ 0 ] =' '; c[ 1 ] ='a';c [ 3 ] = ' m ' ; c [ 4 ] = ' ' ; c [ 5 ] = ' h ' ; c [ 6 ] = ' a ' ; c [ 7 ] = ' p ' ; c [ 8 ] = ' p ' ; c [ 9 ] = ' y ';

以上定义了c为字符数组,包含10个元素。由于字符型数据是以整数形式( ASCII代码)存放的,因此也可以用整型数组来存放字符数据,例如:

int c [ 10 ];

c [ 0 ] = 'a';/ /合法,但浪费存储空间

字符数组的初始化各元素。

对字符数组初始化,最容易理解的方式是用“初始化列表”,把各个字符依次赋给数组中各元素。例如:

char c [ 10 ] ={'I',' ','a','m',' ',' h ' , ' a ' , ' p ' , ' p ',' y '};

把10个字符依次赋给c [ 0 ] ~ c [ 9 ]这10个元素。

如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即\0)例如:

char c [ 10 ] ={'c',' ','p','r',' o ' , ' g ' , ' r ' , ' a ' , ' m ' };

如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:

char c[ ]={'I',' ','a','m',' ',' h ' , ' a ' , ' p ' , ' p ',' y '};

数组c的长度自动定为10。用这种方式可以不必人工去数字符的个数,尤其在赋初值的字符个数较多时,比较方便。也可以定义和初始化一个二维字符数组,例如:

char diamond [5][5] ={{' ',',','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};

用它代表一个菱形的平面图形,如下图

字符串和字符串结束标志

在C语言中,是将字符串作为字符数组来处理的。上例字符串和字符串结束标志在C语言中,是将字符串作为字符数组来处理的。就是用一个一维的字符数组来存放字符串" Iam a student.”的,字符串中的字符是逐个存放到数组元素中的。在该例中,字符串的实际长度与数组长度相等。

在实际工作中,人们关心的往往是字符串的有效长度而不是字符数组的长度。例如,定义一个字符数组长度为100,而实际有效字符只有40个。为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符\0”作为结束标志。如果字符数组中存有若干字符,前面9个字符都不是空字符( '\0' ),而第10个字符是' \0 ',则认为数组中有一个字符串,其有效字符为9个。也就是说,在遇到字符'\0 '时,表示字符串结束把它前面的字符组成一个字符串。

注意:

C系统在用字符数组存储字符串常量时会自动加一个'\0'作为结束符。例" C program”共有9个字符。字符串是存放在一维数组中的,在数组中它占10个字节,最后一个字节' \0 '是由系统自动加上的。

有了结束标志'\0 '后,字符数组的长度就显得不那么重要了。在程序中往往依靠校测' \0 '的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串的长度。

说明:'\0 '代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。

前面曾用过以下语句输出一个字符串。

printf ( " How do you do ? \ n " ) ;

在执行此语句时系统怎么知道应该输出到哪里为止呢?实际上,在向内存中存储时,系统自动在最后一个字符'\ n '的后面加了一个'\0 ',作为字符串结束标志。在执行printf函数时,每输出一个字符检查一次,看下一个字符是否为'\0',遇0就停止输出。

对C语言处理字符串的方法有以上的了解后,再对字符数组初始化的方法补充一种方法,即用字符串常量来使字符数组初始化。例如:

char c [ ] = { " I am happy };

也可以省略花括号,直接写成

char c [ ]= " I am happy”;

这里不像上例那样用单个字符作为字符数组的初值,而是用一个字符串(注意字符串的端是用双撇号而不是单撇号括起来的)作为初值。显然,这种方法直观、方便、符合人们的习惯。请注意,此时数组c的长度不是10,而是11。因为字符串常量的最后由系统加上一个'\0 '。

如果有:

char c [ 10 ] = { " China”};

数组c的前5个元素为:' C ',' h ',' i ',' n ',' a ',第6个元素为' \0 ',后4个元素也自动设定为空字符。

说明:

字符数组并不要求它的最后一个字符为'\0 ',甚至可以不包含'\0’。像以下这样写完全是合法的:

char c [ 5 ] = { ' C ',' h ' , ' i ' , ' n ' , ' a '};

是否需要加'\0 ',完全根据需要决定。由于系统在处理字符串常量存储时会自动加一个'\0 ',因此,为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组中也常常人为地加上一个'\0 '。

例如:

char c [ 6 ] = { ' C ',' h ' , i,' n ' , ' a ','\0'};

这样做,便于引用字符数组中的字符串。

如定义了以下的字符数组:

char c[]={"C program."};

系统自动在字符串常量的最后一个字符后面加了一个'\0 '

若想用一个新的字符串代替原有的字符串“C program.”,如从键盘输入”Hello”分别赋给c数组中前面5个元素。如果不加\0的话,字符数组中的字符如下:

 新字符串和老字符串连成一片,无法区分开。如果想输出字符数组中的字符串,则会连续输出:

Hellogram.

如果在" Hello”后面加一个'\0 ',它取代了第6个字符' g '。在数组中的存储情况为

' \0 '是字符串结束标志,如果用以下语句输出数组c中的字符串:

printf ( " % s\n”,c );

在输出字符数组中的字符串时,遇' \0 '就停止输出,因此只输出了字符串" Hello”。而不会输出" Hellogram.”。从这里可以看到在字符串末尾加\0的作用。

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词