数组有上界和下界,数组的元素在上下界内是连续的。因为 Visual Basic对每一个索引值都分配空间,所以不要不切实际声明一个太大的数组。
对象数组_数组 -数组简介
如果有过用其它语言编程的经历,那么想必会熟悉数组的概念。由于有了数组,可以用相同名字引用一系列变量,并用数字(索引)来识别它们。在许多场合,使用数组可以缩短和简化程序,因为可以利用索引值设计一个循环,高效处理多种情况。数组有上界和下界,数组的元素在上下界内是连续的。因为VisualBasic对每一个索引值都分配空间,所以不要不切实际声明一个太大的数组。
这一部分讨论的数组是程序中声明的变量数组。它们不同于控件数组,控件数组是在设计时通过设置控件的Index属性规定的。变量数组总是连续的;与控件数组不同的是,不能从一个数组的中部加载或卸载数组元素。
一个数组中的所有元素具有相同的数据类型。当然,当数据类型为Variant时,各个元素能够包含不同种类的数据(对象、字符串、数值等等)。可以声明任何基本数据类型的数组,包括用户自定义类型(请参阅“再论编程”中的“创建自己的数据类型”)和对象变量(请参阅“用对象编程”)。
在VisualBasic中有两种类型的数组:固定大小的数组―它总是保持同样的大小,以及在运行时大小可以改变的动态数组。在本章后面的“动态数组”中将要详细讨论动态数组。
声明固定大小的数组
有三种方法声明固定大小的数组,用哪一种方法取决于数组应有的有效范围:
建立公用数组,在模块的声明段用Public语句声明数组。
建立模块级数组,在模块的声明段用Private语句声明数组。
建立局部数组,在过程中用Private语句声明数组。
对象数组_数组 -设定上下界
声明数组时,在数组名之后跟一个用括号括起来的上界。上界不得超过Long数据类型的范围(-2,147,483,648到2,147,483,647)。例如,下列数组声明可出现在模块的声明段:
DimCounters(14)AsInteger'15个元素。
DimSums(20)AsDouble'21个元素。
为建立公用数组,直接用Public取代Dim。
PublicCounters(14)AsInteger
PublicSums(20)AsDouble
在过程之中同样的声明使用Dim:
DimCounters(14)AsInteger
DimSums(20)AsDouble
第一个声明建立了一个有15个元素的数组,其索引号从0到14。第二个声明建立了一个有21个元素的数组,其索引号从0到20。缺省的下界为0。
为了规定下界,用关键字To显式提供下界(为Long数据类型):
DimCounters(1To15)AsInteger
DimSums(100To120)AsString
在前述声明中,Counters的索引值范围从1到15,而Sums的索引值范围从100到200。
包含其它数组的数组
有可能建立Variant数据类型数组,并与不同数据类型的数组共居一处。以下代码建立两个数组,一个包含整数,而另一个包含字符串。然后声明第三个Variant数组,并将整数和字符串数组放置其中:
PrivateSubCommand1_Click()
DimintXAsInteger'声明计数器变量。
'声明并放置整数数组。
DimcountersA(5)AsInteger
ForintX=0To4
countersA(intX)=5
NextintX
'声明并放置字符串数组。
DimcountersB(5)AsString
ForintX=0To4
countersB(intX)="hello"
NextintX
DimarrX(2)AsVariant'声明拥有两个成员的新数组。
arrX(1)=countersA()'将其它数组移居到数组。
arrX(2)=countersB()
MsgBoxarrX(1)(2)'显示每一个数组的成员。
MsgBoxarrX(2)(3)
EndSub
对象数组_数组 -字符数组
如果数组中的元素为字符,就称为“字符数组”。 例如:charstring1[10];//可用来保存10个字符的字符数组 charcity_name1[]={'N','a','n','j','i','n','g'};//7个字符的字符数组C++中字符数组可用来处理字符串,允许直接用字符串常量对字符数组初始化。此时,系统会自动加上一个串结束符′ ′。 例如: charcity_name2[]=”Nanjing”;则字符数组city_name2实际占用的内存比city_name1多一个字节。串结束符′ ′在字符串操作中具有十分重要的意义,因此,在定义字符数组大小时,应注意留出保存串结束符的空间。除了可以用字符串常量初始化外,字符数组的用法与一般数组是一样的。另外,C++中提供若干字符串处理函数,在头文件中定义。其中包括strlen、strcpy等。strlen(s)――返回字符串s的实际长度(不包括′ ′)。strcpy(s1,s2)――将字符串s2中′ ′之前的所有字符依次赋值到字符串s1中,最后再加上一个′ ′。由于不能直接对字符数组名赋值,所以将一个字符串的值赋给另一个字符串必须用字符串复制函数完成。例如:charstring2[20];string2=”VC++”;//非法strcpy(string2,“VC++”);//合法对象数组_数组 -多维数组
有时需要追踪记录数组中的相关信息。例如,为了追踪记录计算机屏幕上的每一个像素,需要引用它的X、Y坐标。这时应该用多维数组存储值。
可用VisualBasic声明多维数组。例如,下面的语句声明了一个过程内的10×10的二维数组。
StaticMatrixA(9,9)AsDouble
可用显式下界来声明两个维数或两个维数中的任何一个:
StaticMatrixA(1To10,1To10)AsDouble
可以将所有这些推广到二维以上的数组。例如:
DimMultiD(3,1To10,1To15)
这个声明建立了三维数组,大小为4×10×15。元素总数为三个维数的乘积,为600。
注意在增加数组的维数时,数组所占的存储空间会大幅度增加,所以要慎用多维数组。使用Variant数组时更要格外小心,因为他们需要更大的存储空间。
对象数组_数组 -用循环操作数组
可以用For循环嵌套有效的处理多维数组。例如,在MatrixA中基于每个元素在数组中的位置为其赋值:
DimIAsInteger,JAsInteger
StaticMatrixA(1To10,1To10)AsDouble
ForI=1To10
ForJ=1To10
MatrixA(I,J)=I*10+J
NextJ
NextI
对象数组_数组 -结构形式
栈内存
在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码中定义一个变量时,java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,java会自动释放掉为该变量所分配的内存空间。
堆内存
堆内存用来存放由new运算符创建的对象和数组,在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理。在堆中创建了一个数组或对象后,同时还在栈内存中定义一个特殊的变量。让栈内存中的这个变量的取值等于数组或者对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。[
对象数组_数组 -数 组
数组在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。数组类型说明在C语言中使用数组必须先进行类型说明。数组说明的一般形
式为:类型说明符数组名【常量表达式】,……;其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
例如:
inta【10】;说明整型数组a,有10个元素。
floatb【10】,c【20】;说明实型数组b,有10个元素,实型数组c,有20个元素。
charch【20】;说明字符数组ch,有20个元素。
对于数组类型说明应注意以下几点:
1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
2.数组名的书写规则应符合标识符的书写规定。
3.数组名不能与其它变量名相同,例如:
voidmain()
{
inta;
floata【10】;
……
}
是错误的。
4.方括号中常量表达式表示数组元素的个数,如a【5】表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a【0】,a【1】,a【2】,a【3】,a【4】。
5.不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:
#defineFD5
voidmain()
{
inta【3+2】,b【7+FD】;
……
}
是合法的。但是下述说明方式是错误的。
voidmain()
{
intn=5;
inta【n】;
……
}
6.允许在同一个类型说明中,说明多个数组和多个变量。
例如:inta,b,c,d,k1【10】,k2【20】;
数组元素的表示方法
数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:数组名【下标】其中的下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如,a【5】,a【i+j】,a【i++】都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量:
for(i=0;i<10;i++)printf("%d",a);而不能用一个语句输出整个数组,下面的写法是错误的:printf("%d",a);
voidmain()
{
inti,a【10】;
for(i=0;i<10;)
a【i++】=2*i+1;
for(i=9;i>=0;i--)
printf("%d",a);
printf("n%d%dn",a【5.2】,a【5.8】);}for(i=0;i<10;)
a【i++】=2*i+1;for(i=9;i>=0;i--)
printf("%d",a);printf("n%d%dn",a【5.2】,a【5.8】);
本例中用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句从大到小输出各个奇数。在第一个for语句中,表达式3省略了。在下标变量中使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作,C语言允许用表达式表示下标。程序中最后一个printf语句输出了两次a【5】的值,可以看出当下标不为整数时将自动取整。数组的赋值给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。数组初始化赋值数组初始化赋值是指在数组说明时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。
初始化赋值的一般形式为:static类型说明符数组名【常量表达式】={值,值……值};其中static表示是静态存储类型,C语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储,外部存储的概念在第五章中介绍)。在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:staticinta【10】={0,1,2,3,4,5,6,7,8,9};相当于a【0】=0;a【1】=1...a【9】=9;
对象数组_数组 -C语言对数组的初始赋值还有以下几点规定:
1.可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给前面部分元素赋值。例如:staticinta【10】={0,1,2,3,4};表示只给a【0】――a【4】5个元素赋值,而后5个元素自动赋0值。
2.只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:staticinta【10】={1,1,1,1,1,1,1,1,1,1};而不能写为:staticinta【10】=1;
3.如不给可初始化的数组赋初值,则全部元素均为0值。
4.如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:staticinta【5】={1,2,3,4,5};可写为:staticinta【】={1,2,3,4,5};动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。
voidmain()
{
inti,max,a【10】;
printf("input10numbers:n");
for(i=0;i<10;i++)
scanf("%d",&a);
max=a【0】;
for(i=1;i<10;i++)
if(a>max)max=a;
printf("maxmum=%dn",max);
}
for(i=0;i<10;i++)
scanf("%d",&a);
max=a【0】;
for(i=1;i<10;i++)
if(a>max)max=a;
printf("maxmum=%dn",max);
本例程序中第一个for语句逐个输入10个数到数组a中。然后把a【0】送入max中。在第二个for语句中,从a【1】到a【9】逐个与max中的内容比较,若比max的值大,则把该下标变量送入max中,因此max总是在已比较过的下标变量中为最大者。比较结束,输出max的值。
voidmain()
{
inti,j,p,q,s,a【10】;
printf("ninput10numbers:n");
for(i=0;i<10;i++)
scanf("%d",&a);
for(i=0;i<10;i++){
p=i;q=a;
for(j=i+1;j<10;j++)
if(q<a【j】){p=j;q=a【j】;}
if(i!=p)
{s=a;
a=a【p】;
a【p】=s;}
printf("%d",a);
}
}
for(i=0;i<10;i++)
scanf("%d",&a);
for(i=0;i<10;i++){
p=i;q=a;
for(j=i+1;j<10;j++)
if(q<a【j】){p=j;q=a【j】;}
if(i!=p)
{s=a;
a=a【p】;
a【p】=s;}
printf("%d",a);
}
本例程序中用了两个并列的for循环语句,在第二个for语句中又嵌套了一个循环语句。第一个for语句用于输入10个元素的初值。第二个for语句用于排序。本程序的排序采用逐个比较的方法进行。在i次循环时,把第一个元素的下标i赋于p,而把该下标变量值a赋于q。然后进入小循环,从a【i+1】起到最后一个元素止逐个与a作比较,有比a大者则将其下标送p,元素值送q。一次循环结束后,p即为最大元素的下标,q则为该元素值。若此时i≠p,说明p,q值均已不是进入小循环之前所赋之值,则交换a和a【p】之值。此时a为已排序完毕的元素。输出该值之后转入下一次循环。对i+1以后各个元素排序。
对象数组_数组 -二维数组
前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。二维数组类型说明二维数组类型说明的一般形式是:
类型说明符数组名【常量表达式1】【常量表达式2】…;
其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。例如:
inta【3】【4】;说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:a【0】【0】,a【0】【1】,a【0】【2】,a【0】【3】
a【1】【0】,a【1】【1】,a【1】【2】,a【1】【3】
a【2】【0】,a【2】【1】,a【2】【2】,a【2】【3】
二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列,即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。在图4.1中,按行顺次存放,先存放a【0】行,再存放a【1】行,最后存放a【2】行。每行中有四个元素也是依次存放。由于数组a说明为
int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节(图中每一格为一字节)。
二维数组元素的表示方法
二维数组的元素也称为双下标变量,其表示的形式为:数组名【下标】【下标】
其中下标应为整型常量或整型表达式。例如:a【3】【4】表示a数组三行四列的元素。下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。
一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
课程成绩姓名MathCDBASE
张807592
王616571
李596370
赵858790
周767785
可设一个二维数组a【5】【3】存放五个人三门课的成绩。再设一个一维数组v【3】存放所求得各分科平均成绩,设变量l为全组各科总平均成绩。编程如下:
voidmain()
{
inti,j,s=0,l,v【3】,a【5】【3】;
printf("inputscoren");
for(i=0;i<3;i++){
for(j=0;j<5;j++)
{scanf("%d",&a【j】);
s=s+a【j】;}
v=s/5;
s=0;
}
l=(v【0】+v【1】+v【2】)/3;
printf("math:%dnclanguag:%dndbase:%dn",v【0】,v【1】,v【2】);
printf("total:%dn",l);
}for(i=0;j<3;i++)
for(j=0;j<5;j++)
{scanf("%d",&a【j】);
s=s+a【j】;}
v=s/5;
s=0;
}
l=(v【0】+v【1】+v【2】)/3;
程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v【0】,v【1】,v【2】相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。
二维数组的初始化
二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组a【5】【3】:
1.按行分段赋值可写为staticinta【5】【3】={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
2.按行连续赋值可写为staticinta【5】【3】={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};
这两种赋初值的结果是完全相同的。
voidmain()
{
inti,j,s=0,l,v【3】;
staticinta【5】【3】={{80,75,92},{61,65,71},{59,63,70},
{85,87,90},{76,77,85}};
for(i=0;i<3;i++)
{for(j=0;j<5;j++)
s=s+a【j】;
v=s/5;
s=0;
}
l=(v【0】+v【1】+v【2】)/3;
printf("math:%dnclanguag:%dndbase:%dn",v【0】,v【1】,v【2】);
printf("total:%dn",l);
}
对于二维数组初始化赋值还有以下说明:
1.可以只对部分元素赋初值,未赋初值的元素自动取0值。
例如:staticinta【3】【3】={,,};是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值为:100200300
staticinta【3】【3】={{0,1},{0,0,2},};赋值后的元素值为010002300
2.如对全部元素赋初值,则第一维的长度可以不给出。
例如:staticinta【3】【3】={1,2,3,4,5,6,7,8,9};可以写为:staticinta【】【3】={1,2,3,4,5,6,7,8,9};
数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解有二维数组a【3】【4】,可分解为三个一维数组,其数组名分别为a【0】,a【1】,a【2】。对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a【0】的元素为a【0】【0】,a【0】【1】,a【0】【2】,a【0】【3】。必须强调的是,a【0】,a【1】,a【2】不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。
字符数组
用来存放字符量的数组称为字符数组。字符数组类型说明的形式与前面介绍的数值数组相同。例如:charc【10】;由于字符型和整型通用,也可以定义为intc【10】但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组,例如:charc【5】【10】;即为二维字符数组。字符数组也允许在类型说明时作初始化赋值。例如:staticcharc【10】={――c――,――――,――p――,――r――,o――,g――,r――,――a――,――m――};赋值后各元素的值为:数组Cc【0】c【1】c【2】c【3】c【4】c【5】c【6】c【7】c【8】c【9】其中c【9】未赋值,由系统自动赋予0值。当对全体元素赋初值时也可以省去长度说明。例如:staticcharc【】={――c――,――――,――p――,――r――,――o――,――g――,――r――,――a――,――m――};这时C数组的长度自动定为9。
main()
{
inti,j;
chara【】【5】={{'B','A','S','I','C',},{'d','B','A','S','E'}};
for(i=0;i<=1;i++)
{
for(j=0;j<=4;j++)
printf("%c",a【j】);
printf("n");
}
}
本例的二维字符数组由于在初始化时全部元素都赋以初值,因此一维下标的长度可以不加以说明。字符串在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。在2.1.4节介绍字符串常量时,已说明字符串总是以' '作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符' '存入数组,并以此作为该字符串是否结束的标志。有了' '标志后,就不必再用字符数组的长度来判断字符串的长度了。
C语言允许用字符串的方式对数组作初始化赋值。例如:
staticcharc【】={'c','','p','r','o','g','r','a','m'};可写为:
staticcharc【】={"Cprogram"};或去掉{}写为:
sraticcharc【】="Cprogram";
用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志' '。上面的数组c在内存中的实际存放情况为:Cprogram ―― '是由C编译系统自动加上的。由于采用了―― '标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。
voidmain()
{
staticcharc【】="BASICndBASE";
printf("%sn",c);
}printf("%sn",c);
注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:printf("%s",c【】);
voidmain()
{
charst【15】;
printf("inputstring:n");
scanf("%s",st);
printf("%sn",st);
}charst【15】;
本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志―― ――。应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如运行例4.8,当输入的字符串中含有空格时,运行情况为:inputstring:thisisabookthis从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:
Lesson
voidmain()
{
charst1【6】,st2【6】,st3【6】,st4【6】;
printf("inputstring:n");
scanf("%s%s%s%s",st1,st2,st3,st4);
printf("%s%s%s%sn",st1,st2,st3,st4);
}
本程序分别设了四个数组,输入的一行字符的空格分段分别装入四个数组。然后分别输出这四个数组中的字符串。在前面介绍过,scanf的各输入项必须以地址方式出现,如&a,&b等。但在例4.8中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。如有字符数组charc【10】,在内存可表示如图4.2。设数组c的首地址为2000,也就是说c【0】单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。在执行函数printf("%s",c)时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志' '为止。
对象数组_数组 -字符串常用函数
C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件"stdio.h";使用其它字符串函数则应包含头文件"string.h"。下面介绍几个最常用的字符串函数。
1.字符串输出函数puts格式:puts(字符数组名)功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串
#include"stdio.h"
main()
{
staticcharc【】="BASICndBASE";
puts(c);
}
staticcharc【】="BASICndBASE";
puts(c);
从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。
2.字符串输入函数gets格式:gets(字符数组名)功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。
#include"stdio.h"
main()
{
charst【15】;
printf("inputstring:n");
gets(st);
puts(st);
}
可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。
3.字符串连接函数strcat格式:strcat(字符数组名1,字符数组名2)功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志“ ”。本函数返回值是字符数组1的首地址。
#include"string.h"
main()
{
staticcharst1【30】="Mynameis";
intst2【10】;
printf("inputyourname:n");
gets(st2);
strcat(st1,st2);
puts(st1);
}
staticcharst1【30】="Mynameis";
intst2【10】;
printf("inputyourname:n");
gets(st2);
strcat(st1,st2);
本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串
4.字符串拷贝函数strcpy格式:strcpy(字符数组名1,字符数组名2)功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“ ”也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
#include"string.h"
main()
{
staticcharst1【15】,st2【】="Clanguage";
strcpy(st1,st2);
puts(st1);printf("n");
}
staticcharst1【15】,st2【】="CLanguage";
strcpy(st1,st2);
本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。
5.字符串比较函数strcmp格式:strcmp(字符数组名1,字符数组名2)功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串1=字符串2,返回值=0;
字符串2〉字符串2,返回值〉0;
字符串1〈字符串2,返回值〈0。
本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
#include"string.h"
main()
{intk;
staticcharst1【15】,st2【】="CLanguage";
printf("inputastring:n");
gets(st1);
k=strcmp(st1,st2);
if(k==0)printf("st1=st2n");
if(k>0)printf("st1>st2n");
if(k<0)printf("st1<st2n");
}
{intk;
staticcharst1【15】,st2【】="CLanguage";
printf("inputastring:n");
gets(st1);
k=strcmp(st1,st2);
if(k==0)printf("st1=st2n");
if(k>0)printf("st1>st2n");
if(k<0)printf("st1<st2n");
}
本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果提示串。当输入为dbase时,由ASCII码可知“dBASE”大于“CLanguage”故k〉0,输出结果“st1>st2”。
6.测字符串长度函数strlen格式:strlen(字符数组名)功能:测字符串的实际长度(不含字符串结束标志‘ ’)并作为函数返回值。
#include"string.h"
main()
{intk;
staticcharst【】="Clanguage";
k=strlen(st);
printf("Thelenthofthestringis%dn",k);
}
对象数组_数组 -资料收集
:beckCopyright2002http://www.baike.com/wiki/www.vcok.com,AllRightsReserved--------------------------------------------------------------------------------