1. 程式人生 > 其它 >C語言陣列:C語言陣列定義、二維陣列、動態陣列、字串陣列

C語言陣列:C語言陣列定義、二維陣列、動態陣列、字串陣列

技術標籤:字串pythonjavac++程式語言

1.C語言陣列的概念

在《更加優美的C語言輸出》一節中我們舉了一個例子,是輸出一個 4×4 的整數矩陣,程式碼如下:

     
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a1=20, a2=345, a3=700, a4=22;
  6. int b1=56720, b2=9999, b3=20098, b4=2;
  7. int c1=233, c2=205, c3=1, c4=6666;
  8. int d1=34, d2=0, d3=23
    , d4=23006783;
  9. printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4);
  10. printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
  11. printf("%-9d %-9d %-9d %-9d\n", c1, c2, c3, c4);
  12. printf("%-9d %-9d %-9d %-9d\n", d1, d2, d3, d4);
  13. system("pause");
  14. return
    0;
  15. }
執行結果: 20 345 700 22 56720 9999 20098 2 233 205 1 6666 34 0 23 23006783 矩陣共有 16 個整數,我們為每個整數定義了一個變數,也就是 16 個變數。那麼,為了減少變數的數量,讓開發更有效率,能不能為多個數據定義一個變數呢?比如,把每一行的整數放在一個變數裡面,或者把 16 個整數全部都放在一個變數裡面。 我們知道,要想把資料放入記憶體,必須先要分配記憶體空間。放入4個整數,就得分配4個int型別的記憶體空間:

     
  1. int a[4];
這樣,就在記憶體中分配了4個int型別的記憶體空間,共 4×4=16 個位元組,併為它們起了一個名字,叫a。 我們把這樣的一組資料的集合稱為 陣列(Array)
,它所包含的每一個數據叫做陣列 元素(Element),所包含的資料的個數稱為陣列 長度(Length),例如int a[4];就定義了一個長度為4的整型陣列,名字是a。 陣列中的每個元素都有一個序號,這個序號從0開始,而不是從我們熟悉的1開始,稱為 下標(Index)。使用陣列元素時,指明下標即可,形式為:

     
  1. arrayName[index]
arrayName 為陣列名稱,index 為下標。例如,a[0] 表示第0個元素,a[3] 表示第3個元素。 接下來我們就把第一行的4個整數放入陣列:

     
  1. a[0]=20;
  2. a[1]=345;
  3. a[2]=700;
  4. a[3]=22;
這裡的0、1、2、3就是陣列下標,a[0]、a[1]、a[2]、a[3] 就是陣列元素。 我們來總結一下陣列的定義方式:

     
  1. dataType arrayName[length];
dataType 為資料型別,arrayName 為陣列名稱,length 為陣列長度。例如:

     
  1. float m[12];
  2. char ch[9];
注意: 1) 陣列中每個元素的資料型別必須相同,對於int a[4];,每個元素都必須為 int。 2) 陣列下標必須是整數,取值範圍為 0 ≥ index > length。 3) 陣列是一個整體,它的記憶體是連續的,下面是int a[4];的記憶體示意圖:

①.陣列的初始化

上面的程式碼是先定義陣列再給陣列賦值,我們也可以在定義陣列的同時賦值:

     
  1. int a[4] = {20, 345, 700, 22};
{ }中的值即為各元素的初值,各值之間用,間隔。 對陣列賦初值需要注意以下幾點: 1) 可以只給部分元素賦初值。當{ }中值的個數少於元素個數時,只給前面部分元素賦值。例如:

     
  1. int a[10]={12, 19, 22 , 993, 344};
表示只給 a[0]~a[4] 5個元素賦值,而後面5個元素自動賦0值(int 型別變數的預設值就是0)。 2) 只能給元素逐個賦值,不能給陣列整體賦值。例如給十個元素全部賦1值,只能寫為:

     
  1. int a[10]={1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
而不能寫為:

    
  1. int a[10]=1;
3) 如給全部元素賦值,那麼在陣列定義時可以不給出陣列的長度。例如:

     
  1. int a[]={1,2,3,4,5};
等價於

     
  1. int a[5]={1,2,3,4,5};
最後,我們藉助陣列來輸出一個 4×4 的矩陣:

     
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a[4] = {20, 345, 700, 22};
  6. int b[4] = {56720, 9999, 20098, 2};
  7. int c[4] = {233, 205, 1, 6666};
  8. int d[4] = {34, 0, 23, 23006783};
  9. printf("%-9d %-9d %-9d %-9d\n", a[0], a[1], a[2], a[3]);
  10. printf("%-9d %-9d %-9d %-9d\n", b[0], b[1], b[2], b[3]);
  11. printf("%-9d %-9d %-9d %-9d\n", c[0], c[1], c[2], c[3]);
  12. printf("%-9d %-9d %-9d %-9d\n", d[0], d[1], d[2], d[3]);
  13. system("pause");
  14. return 0;
  15. }

2.C語言二維陣列

上節講解的陣列可以看作是一行連續的資料,只有一個下標,稱為一維陣列。在實際問題中有很多量是二維的或多維的,因此C語言允許構造多維陣列。多維陣列元素有多個下標,以確定它在陣列中的位置。本節只介紹二維陣列,多維陣列可由二維陣列類推而得到。

①.二維陣列的定義

二維陣列定義的一般形式是:

      
  1. dataType arrayName[length1][length2];
其中, dataType 為資料型別,arrayName 為陣列名,length1 為第一維下標的長度,length2 為第二維下標的長度。例如:

      
  1. int a[3][4];
定義了一個3行4列的陣列,共有3×4=12個元素,陣列名為a,即:

      
  1. a[0][0], a[0][1], a[0][2], a[0][3]
  2. a[1][0], a[1][1], a[1][2], a[1][3]
  3. a[2][0], a[2][1], a[2][2], a[2][3]
在二維陣列中,要定位一個元素,必須給出一維下標和二維下標,就像在一個平面中確定一個點,要知道x座標和y座標。例如,a[3][4] 表示a陣列第3行第4列的元素。 二維陣列在概念上是二維的,但在記憶體中地址是連續的,也就是說儲存器單元是按一維線性排列的。那麼,如何在一維儲存器中存放二維陣列呢?有兩種方式:一種是按行排列, 即放完一行之後順次放入第二行。另一種是按列排列, 即放完一列之後再順次放入第二列。 在C語言中,二維陣列是按行排列的。也就是先存放a[0]行,再存放a[1]行,最後存放a[2]行;每行中的四個元素也是依次存放。陣列a為int型別,每個元素佔用4個位元組,整個陣列共佔用4×(3×4)=48個位元組。 【示例】一個學習小組有5個人,每個人有三門課的考試成績。求全組分科的平均成績和各科總平均成績。
--
Math8061598576
C7565638777
English9271709085
可設一個二維陣列a[5][3]存放五個人三門課的成績。再設一個一維陣列v[3]存放所求得各分科平均成績,設變數average 為全組各科總平均成績。程式設計如下:

      
  1. #include <stdio.h>
  2. int main(){
  3. int i, j; //二維陣列下標
  4. int sum=0; //當前科目的總成績
  5. int average; //總平均分
  6. int v[3]; //各科平均分
  7. int a[5][3]; //用來儲存每個同學各科成績的二維陣列
  8. printf("Input score:\n");
  9. for(i=0; i<3; i++){
  10. for(j=0; j<5; j++){
  11. scanf("%d", &a[j][i]); //輸入每個同學的各科成績
  12. sum+=a[j][i]; //計算當前科目的總成績
  13. }
  14. v[i]=sum/5; // 當前科目的平均分
  15. sum=0;
  16. }
  17. average =(v[0]+v[1]+v[2])/3;
  18. printf("Math: %d\nC Languag: %d\nEnglish: %d\n", v[0], v[1], v[2]);
  19. printf("Total:%d\n", average);
  20. return 0;
  21. }
執行結果: Input score: 80 61 59 85 76 75 65 63 87 77 92 71 70 90 85 Math: 72 C Languag: 73 English: 81 Total:75 程式中首先用了一個雙重迴圈。在內迴圈中依次讀入某一門課程的各個學生的成績,並把這些成績累加起來,退出內迴圈後再把該累加成績除以5送入v[i]之中,這就是該門課程的平均成績。外迴圈共迴圈三次,分別求出三門課各自的平均成績並存放在v陣列之中。退出外迴圈之後,把v[0]、v[1]、v[2]相加除以3即得到各科總平均成績。最後按題意輸出各個成績。

①.二維陣列的初始化

二維陣列的初始化可以按行分段賦值,也可按行連續賦值。 例如對陣列a[5][3],按行分段賦值可寫為:

      
  1. int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
按行連續賦值可寫為:

      
  1. int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
這兩種賦初值的結果是完全相同的。 【示例】求各科平均分和總成績平均分。

      
  1. #include <stdio.h>
  2. int main(){
  3. int i, j; //二維陣列下標
  4. int sum=0; //當前科目的總成績
  5. int average; //總平均分
  6. int v[3]; //各科平均分
  7. int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
  8. for(i=0; i<3; i++){
  9. for(j=0; j<5; j++){
  10. sum+=a[j][i]; //計算當前科目的總成績
  11. }
  12. v[i]=sum/5; // 當前科目的平均分
  13. sum=0;
  14. }
  15. average =(v[0]+v[1]+v[2])/3;
  16. printf("Math: %d\nC Languag: %d\nEnglish: %d\n", v[0], v[1], v[2]);
  17. printf("Total:%d\n", average);
  18. return 0;
  19. }
執行結果: Math: 72 C Languag: 73 English: 81 Total:75 對於二維陣列初始化賦值還有以下說明 1) 可以只對部分元素賦初值,未賦初值的元素自動取0值。例如:

      
  1. int a[3][3]={{1},{2},{3}};
是對每一行的第一列元素賦值,未賦值的元素取0值。 賦值後各元素的值為: 1 0 0 2 0 0 3 0 0

      
  1. int a [3][3]={{0,1},{0,0,2},{3}};
賦值後的元素值為: 0 1 0 0 0 2 3 0 0 2) 如對全部元素賦初值,則第一維的長度可以不給出。例如:

      
  1. int a[3][3]={1,2,3,4,5,6,7,8,9};
可以寫為:

      
  1. int a[][3]={1,2,3,4,5,6,7,8,9};
3) 陣列是一種構造型別的資料。二維陣列可以看作是由一維陣列的巢狀而構成的。設一維陣列的每個元素都又是一個數組,就組成了二維陣列。當然,前提是各元素型別必須相同。根據這樣的分析,一個二維陣列也可以分解為多個一維陣列。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]不能當作下標變數使用,它們是陣列名,不是一個單純的下標變數。

3.C語言字元陣列和字串

用來存放字元的陣列稱為字元陣列,例如:

      
  1. char c[10];
由於char和int可以相互轉換,也可以定義為:

      
  1. int c[10];
但這時每個陣列元素佔4個位元組的記憶體。 字元陣列也可以是二維或多維陣列。例如:

      
  1. char c[5][10];
字元陣列也允許在定義時進行初始化,例如:

      
  1. char c[10]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // c[9]未賦值,所以為預設值0
當對全體元素賦初值時也可以省去長度說明。例如:

      
  1. char c[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' };
這時c陣列的長度自動定為9。 字元陣列和普通陣列一樣,也是通過下標引用各個元素。 【示例】輸出字元陣列中的元素。

      
  1. #include <stdio.h>
  2. int main(){
  3. int i,j;
  4. char a[][7]={
  5. {'C',' ','L','a','n','g'},
  6. {'P','r','o','g','r','a','m'},
  7. {'F','u','n','n','y'}
  8. };
  9. for(i=0; i<=2; i++){
  10. for(j=0; j<=6; j++){
  11. printf("%c", a[i][j]);
  12. }
  13. printf("\n");
  14. }
  15. return 0;
  16. }
執行結果: C Lang Program Funny 本例的二維字元陣列由於在初始化時全部元素都賦以初值,因此一維下標的長度可以不寫。

①.字串和字串結束標誌

在C語言中沒有專門的字串變數,沒有string型別,通常用一個字元陣列來存放一個字串。 前面已經教大家用puts和printf函式輸出字串,例如:

      
  1. puts("http://c.biancheng.net");
  2. printf("C Language");
在C語言中,字串總是以'\0'作為串的結束符。上面的兩個字串,編譯器已經在末尾自動添加了'\0'。 '\0'是ASCII碼錶中的第0個字元,用NUL表示,稱為空字元。該字元既不能顯示,也不是控制字元,輸出該字元不會有任何效果,它在C語言中僅作為字串的結束標誌。 字串處理函式遇到NUL時會認為字串已經結束,不再繼續操作,例如:

      
  1. #include <stdio.h>
  2. int main(){
  3. puts("C Lang\0 is funny!");
  4. return 0;
  5. }
執行結果: C Lang 可以發現,'\0' 後面的字元都沒有輸出。 當把字串存入字元陣列時,也應該把結束符 '\0' 存入陣列,並以此作為該字串是否結束的標誌。有了'\0'標誌後,就不必再用字元陣列的長度來判斷字串的長度了。 C語言允許用字串的方式對陣列作初始化賦值。例如:

      
  1. char c[]={'c', ' ','p','r','o','g','r','a','m'};
可寫為:

      
  1. char c[]={"C program"};
或去掉{}寫為:

      
  1. char c[]="C program";
用字串方式賦值比用字元逐個賦值要多佔一個位元組, 用於存放字串結束標誌 '\0'。上面的陣列c在記憶體中的實際存放情況為: '\0' 是由編譯器自動加上的。由於採用了 '\0' 標誌,所以在用字串賦初值時一般無須指定陣列的長度, 而由編譯器自行處理。

②.字元陣列的輸入輸出

在採用字串方式後,字元陣列的輸入輸出將變得簡單方便。除了上述用字串賦初值的辦法外,還可用printf函式和scanf函式一次性輸出輸入一個字元陣列中的字串,而不必使用迴圈語句逐個地輸入輸出每個字元。 【示例】使用printf輸出整個字元陣列。

      
  1. #include <stdio.h>
  2. int main(){
  3. char c[]="C Lang\nJava\nC++\nPython";
  4. printf("%s\n", c);
  5. return 0;
  6. }
執行結果: C Lang Java C++ Python 在printf函式中,使用%s輸出字串。注意在輸出列表中給出陣列名即可。不能寫為printf("%s", c[]);。 【示例】使用scanf從控制檯輸入一個字串,然後使用printf將其輸出。

      
  1. #include <stdio.h>
  2. int main(){
  3. char str[100]; //必須說明長度,不能寫為 char str[];
  4. printf("Input string: ");
  5. scanf("%s", str);
  6. printf("Your string is: %s\n", str);
  7. return 0;
  8. }
執行結果: Input string: http://c.biancheng.net↙ Your string is: http://c.biancheng.net 由於字元陣列長度為100,因此輸入的字串長度必須小於100,以留出一個位元組用於存放字串結束標誌`\0`。

③對程式的幾點說明

1) 對一個字元陣列,如果不作初始化賦值,則必須說明陣列長度。 2) 當用scanf函式輸入字串時,字串中不能含有空格,否則將以空格作為串的結束符。 例如當輸入的字串中含有空格時,執行結果為: Input string: c language↙ Your string is: c 可以看出,空格以後的字元都未能輸出。為了避免這種情況,可多設幾個字元陣列分段存放含空格的串。程式可改寫如下:

      
  1. #include <stdio.h>
  2. int main(){
  3. char str1[20], str2[20], str3[20], str4[20];
  4. printf("Input string: ");
  5. scanf("%s %s %s %s",str1, str2, str3, str4);
  6. printf("Your string: %s %s %s %s\n", str1, str2, str3, str4);
  7. return 0;
  8. }
執行結果: Input string: C C++ Java Python Your string: C C++ Java Python 3) 在《從鍵盤輸入資料》中講到,scanf 的各個變數前面要加取地址符&,用以獲得變數的地址,例如:

      
  1. int a, b;
  2. scanf("%d %d", &a, &b);
但是在本節的示例中,將字串讀入字元陣列卻沒有使用&,例如:

      
  1. char str1[20], str2[20], str3[20], str4[20];
  2. scanf("%s %s %s %s",str1, str2, str3, str4);
這是因為C語言規定,陣列名就代表了該陣列的地址。整個陣列是一塊連續的記憶體單元,如有字元陣列char c[10],在記憶體可表示為: C語言還規定,陣列名所代表的地址為第0個元素的地址,例如char c[10];,c就代表c[0]的地址。第0個元素的地址就是陣列的起始地址,所以稱為 首地址。也就是說,陣列名錶示陣列的首地址。 設陣列c的首地址為0X2000,也就是說c[0]地址為0X2000,則陣列名c就代表這個首地址。 因為c已經表示地址,所以在c前面不能再加取地址符&,例如寫作 scanf("%s",&c); 是錯誤的。 有了首地址,有了字串結束符'\0',就可以完整的定位一個字串了。例如:

      
  1. printf("%s", c);
printf 函式會根據陣列名找到c的首地址,然後逐個輸出陣列中各個字元直到遇到 '\0' 為止。 int、float、char 型別的變量表示資料本身,資料就儲存在變數中;而陣列名錶示的是陣列的首地址,陣列儲存在其他記憶體單元,陣列名儲存的是這塊記憶體的首地址。後面我們會講解指標,大家將會有更加深刻的理解。

4.C語言字串處理函式

C語言提供了豐富的字串處理函式,例如字串的輸入、輸出、合併、修改、比較、轉換、複製、搜尋等,使用這些現成的函式可大大減輕程式設計的負擔。 用於輸入輸出的字串函式,例如printf、puts、scanf、gets等,使用時應包含標頭檔案stdio.h,使用其它字串函式則應包含標頭檔案string.h。

①.字串輸入輸出函式

printf、puts、scanf 前面已經介紹過了,不再贅述,這裡重點講解gets函式。 gets 是 get string 的縮寫,意思是獲取使用者從鍵盤輸入的字串,語法格式為: gets(arrayName); arrayName 為字元陣列。從鍵盤獲得的字串,將儲存在 arrayName 中。請看下面的例子:

      
  1. #include <stdio.h>
  2. int main(){
  3. char str[60];
  4. printf("Input string: ");
  5. gets(str);
  6. puts(str);
  7. return 0;
  8. }
執行結果: Input string: C Java C++ Python C Java C++ Python 可以看出當輸入的字串中含有空格時,輸出仍為全部字串。說明 gets 函式並不以空格作為字串輸入結束的標誌,而只以回車作為輸入結束,這與 scanf 函式是不同的。

②.字串長度函式strlen

strlen 是 string length 的縮寫,用來獲得字串的長度。所謂長度,就是包含多少個字元(不包括字串結束標誌 '\0')。語法格式為:

      
  1. strlen(arrayName);
strlen 將返回字串的長度,它是一個整數。請看下面的例子:

      
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4. char str[]="C language";
  5. int len = strlen(str);
  6. printf("The lenth of the string is %d\n", len);
  7. return 0;
  8. }
執行結果: The lenth of the string is 10 需要說明的是,strlen 會從字串的第 0 個字元開始計算,直到遇到字串結束標誌 '\0'。將上面程式碼中的 str 改為:

      
  1. char str[]="C \0language";
那麼輸出結果就是: The lenth of the string is 2

③.字串連線函式 strcat

strcat 是 string catenate 的縮寫,意思是把兩個字串拼接在一起,語法格式為:

      
  1. strcat(arrayName1, arrayName2);
arrayName1、arrayName2 為需要拼接的字串。 strcat 將把 arrayName2 連線到 arrayName1 後面,並刪去 arrayName1 最後的結束標誌 '\0'。 這就意味著,arrayName1 的長度要足夠,必須能夠同時容納 arrayName1 和 arrayName2,否則會越界。 strcat 返回值為 arrayName1 的首地址。請看下面的例子:

      
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4. char str1[40]="My name is ";
  5. int str2[20];
  6. printf("Input your name:");
  7. gets(str2);
  8. strcat(str1,str2);
  9. puts(st1);
  10. return 0;
  11. }
執行結果: Input your name:xiao p My name is xiao p

④.字串複製函式strcpy

strcpy 是 string copy 的縮寫,意思是字串複製,語法格式為:

      
  1. strcpy(arrayName1, arrayName2);
strcpy 會把 arrayName2 中的字串拷貝到 arrayName1 中,串結束標誌 '\0' 也一同拷貝。arrayName 也可以是一個字串常量,這時相當於把一個字串賦值給一個字元陣列。請看下面的例子:

      
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4. char str1[15], str2[]="C Language";
  5. strcpy(str1, str2);
  6. puts(str1);
  7. printf("\n");
  8. return 0;
  9. }
執行結果: C Language strcat 要求 arrayName1 要有足夠的長度,否則不能全部裝入所拷貝的字串。

5.對C語言陣列的總結以及例項

陣列(Array)是一系列相同型別的資料的集合,可以是一維的、二維的、多維的;最常用的是一維陣列和二維陣列,多維陣列較少用到。

①.對陣列的總結

1) 陣列的定義格式為:

      
  1. type arrayName[length]
type 為資料型別,arrayName 為陣列名,length 為陣列長度。 需要注意的是:
  1. length 必須是一個數值常量,不能是變數,因為程式碼編譯期間編譯器要明確知道陣列元素的個數,而變數的值是不確定的。
  2. 陣列中的資料儲存在一個記憶體區域A,而陣列名儲存另外一個記憶體區域B,陣列名中包含的是A的首地址。
2) 訪問陣列中某個元素的格式為: index 為陣列下標。 注意 index 的值不能大於 length,否則會發生陣列越界,出現意想不到的錯誤。 3) 可以對陣列中的單個元素賦值,也可以整體賦值,例如:

      
  1. // 對單個元素賦值
  2. int a[3];
  3. a[0] = 3;
  4. a[1] = 100;
  5. a[2] = 34;
  6. // 整體賦值(不指明陣列長度)
  7. float b[] = { 23.3, 100.00, 10, 0.34 };
  8. // 整體賦值(指明陣列長度)
  9. int m[10] = { 100, 30, 234 };
  10. // 字元陣列賦值
  11. char str[] = "http://c.biancheng.net";
對陣列整體賦值時,可以不指名陣列的長度。未賦值的元素為預設值。

②.陣列應用舉例

求一個整型陣列中的最大值和最小值。

      
  1. #include <stdio.h>
  2. int main(){
  3. int a[10] = {2, 123, 45, 100, 575, 240, 799, 710, 10, 90};
  4. int max=a[0], min=a[0]; //最大值和最小值
  5. int i; //迴圈增量
  6. int len = sizeof(a) / sizeof(int); //計算陣列長度
  7. for(i=1; i<len; i++){
  8. if(a[i] > max){
  9. max = a[i];
  10. }
  11. if(a[i] < min){
  12. min = a[i];
  13. }
  14. }
  15. printf("The max is %d, The min is %d\n", max, min);
  16. return 0;
  17. }
執行結果: The max is 799, The min is 2 思考一下,max 和 min 的初值為什麼要設為 a[0] 呢,預設不可以嗎?

③.關於排序和查詢

學完了陣列,有兩個重要的知識點要求大家掌握,那就是排序(Sort)和查詢(Search),比如:
  1. 給你 10 個打亂順序的整數,要能夠按照從小到大或者從大到小的順序輸出;
  2. 給定一個字串 str1,以及一個子串 str2,要能夠判斷 str2 是否在 str1 中。
來自為知筆記(Wiz)