數組

數組

數組有上界和下界,數組的元素在上下界內是連續的。因為 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++中字元數組可用來處理字元串,允許直接用字元串常量對字元數組初始化。此時,系統會自動加上一個串結束符′\0′。 例如: charcity_name2[]=”Nanjing”;則字元數組city_name2實際占用的記憶體比city_name1多一個位元組。串結束符′\0′在字元串操作中具有十分重要的意義,因此,在定義字元數組大小時,應注意留出保存串結束符的空間。除了可以用字元串常量初始化外,字元數組的用法與一般數組是一樣的。另外,C++中提供若干字元串處理函式,在頭檔案中定義。其中包括strlen、strcpy等。strlen(s)——返回字元串s的實際長度(不包括′\0′)。strcpy(s1,s2)——將字元串s2中′\0′之前的所有字元依次賦值到字元串s1中,最後再加上一個′\0′。由於不能直接對字元數組名賦值,所以將一個字元串的值賦給另一個字元串必須用字元串複製函式完成。例如: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%d\n",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%d\n",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=%d\n",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=%d\n",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個人,每個人有三門課的考試成績。求全組分科的平均成績和各科總平均成績。
課程成績姓名Math C DBASE
張8075 92
王6165 71
李5963 70
趙8587 90
周7677 85
可設一個二維數組a【5】【3】存放五個人三門課的成績。再設一個一維數組v【3】存放所求得各分科平均成績,設變數l為全組各科總平均成績。編程如下:
voidmain()
{
inti,j,s=0,l,v【3】,a【5】【3】;
printf("inputscore\n");
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:%d\nclanguag:%d\ndbase:%d\n",v【0】,v【1】,v【2】);
printf("total:%d\n",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:%d\nclanguag:%d\ndbase:%d\n",v【0】,v【1】,v【2】);
printf("total:%d\n",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節介紹字元串常量時,已說明字元串總是以'\0'作為串的結束符。因此當把一個字元串存入一個數組時,也把結束符'\0'存入數組,並以此作為該字元串是否結束的標誌。有了'\0'標誌後,就不必再用字元數組的長度來判斷字元串的長度了。
C語言允許用字元串的方式對數組作初始化賦值。例如:
staticcharc【】={'c','','p','r','o','g','r','a','m'};可寫為:
staticcharc【】={"Cprogram"};或去掉{}寫為:
sraticcharc【】="Cprogram";
用字元串方式賦值比用字元逐個賦值要多占一個位元組,用於存放字元串結束標誌'\0'。上面的數組c在記憶體中的實際存放情況為:Cprogram\0——\0'是由C編譯系統自動加上的。由於採用了——\0'標誌,所以在用字元串賦初值時一般無須指定數組的長度,而由系統自行處理。在採用字元串方式後,字元數組的輸入輸出將變得簡單方便。除了上述用字元串賦初值的辦法外,還可用printf函式和scanf函式一次性輸出輸入一個字元數組中的字元串,而不必使用循環語句逐個地輸入輸出每個字元。
voidmain()
{
staticcharc【】="BASIC\ndBASE";
printf("%s\n",c);
}printf("%s\n",c);
注意在本例的printf函式中,使用的格式字元串為“%s”,表示輸出的是一個字元串。而在輸出表列中給出數組名則可。不能寫為:printf("%s",c【】);
voidmain()
{
charst【15】;
printf("inputstring:\n");
scanf("%s",st);
printf("%s\n",st);
}charst【15】;
本例中由於定義數組長度為15,因此輸入的字元串長度必須小於15,以留出一個位元組用於存放字元串結束標誌——\0——。應該說明的是,對一個字元數組,如果不作初始化賦值,則必須說明數組長度。還應該特別注意的是,當用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%s\n",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找到首地址,然後逐個輸出數組中各個字元直到遇到字元串終止標誌'\0'為止。

字元串常用函式

C語言提供了豐富的字元串處理函式,大致可分為字元串的輸入、輸出、合併、修改、比較、轉換、複製、搜尋幾類。使用這些函式可大大減輕編程的負擔。用於輸入輸出的字元串函式,在使用前應包含頭檔案"stdio.h";使用其它字元串函式則應包含頭檔案"string.h"。下面介紹幾個最常用的字元串函式。
1.字元串輸出函式puts格式:puts(字元數組名)功能:把字元數組中的字元串輸出到顯示器。即在螢幕上顯示該字元串
#include"stdio.h"
main()
{
staticcharc【】="BASIC\ndBASE";
puts(c);
}
staticcharc【】="BASIC\ndBASE";
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後的串標誌“\0”。本函式返回值是字元數組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中。串結束標誌“\0”也一同拷貝。字元數名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=st2\n");
if(k>0)printf("st1>st2\n");
if(k<0)printf("st1<st2\n");
}
{intk;
staticcharst1【15】,st2【】="CLanguage";
printf("inputastring:\n");
gets(st1);
k=strcmp(st1,st2);
if(k==0)printf("st1=st2\n");
if(k>0)printf("st1>st2\n");
if(k<0)printf("st1<st2\n");
}
本程式中把輸入的字元串和數組st2中的串比較,比較結果返回到k中,根據k值再輸出結果提示串。當輸入為dbase時,由ASCII碼可知“dBASE”大於“CLanguage”故k〉0,輸出結果“st1>st2”。
6.測字元串長度函式strlen格式:strlen(字元數組名)功能:測字元串的實際長度(不含字元串結束標誌‘\0’)並作為函式返回值。
#include"string.h"
main()
{intk;
staticcharst【】="Clanguage";
k=strlen(st);
printf("Thelenthofthestringis%d\n",k);
}

資料收集

:beckCopyright2002/wiki/www.vcok.com,AllRightsReserved
--------------------------------------------------------------------------------

相關詞條

相關搜尋

熱門詞條

聯絡我們