1. 程式人生 > >C筆記(九)——陣列和字串

C筆記(九)——陣列和字串

一、陣列    //陣列必須先定義,後引用

1.1 一維陣列的定義

表現形式:型別說明符 陣列名【常量表達式】; //常量表達式中可以包括常量和符號常量,不能包含變數

例如:int array [10];   定義了一個叫array的一維陣列,從array[0]-array[9]一共有10個元素,每個元素都是int型的。

 說明:

    (1)array [0] = 10;  給第一個陣列賦值為10。

    (2)int array[5] = {6, 8, 8, 10, 9}; //給array陣列內的5個元素分別賦值為6, 8, 8, 10, 9。在給了陣列的全部元素後,

"[ ]"內的常量表達式可忽略。如:int array[ ] = {6, 8, 8, 10, 9};

    (3)也可以只給一部分元素賦值。如:int array[5] = {6, 8}; //表示int array[5] = {6, 8, 0, 0, 0};

int main()//一維陣列輸出實數和字串
{
    int i;
    int array[10] = {5, 4, 8, 12, 20};  //實數陣列中不夠的元素用0補齊,並輸出顯示

    for(i = 0; i < 10; i++)  //顯示一維實數陣列一般用for迴圈,來顯示陣列的全部元素
        {
            printf("array[%d] = %d\n",i, array[i]);
        }

     char b[10] = "abc"; //字元陣列陣列長度大於實際字串長度時,只輸出到遇0(‘\0’)結束。
printf("{%s}\n",b); return 0; }
//實數陣列中不夠的元素用0補齊,並輸出顯示 for(i = 0; i < 10; i++) //顯示一維實數陣列一般用for迴圈,來顯示陣列的全部元素 { printf("array[%d] = %d\n",i, array[i]); } char b[10] = "abc"; //字元陣列陣列長度大於實際字串長度時,只輸出到遇0(‘\0’)結束。 printf("{%s}\n",b); return 0; }

執行結果:

1.2 一維陣列元素的引用

     陣列元素的表示形式為:陣列名 [下標]; //下標可以是整型常量或者整型表示式

    如:a[0] = a[5] + a[7] - a[2 * 3];

注:定義陣列時用到的“陣列名【常量表達式】”和引用陣列元素時用到的“陣列名【下標】”的區別,例如:

    (1)int a[10];   //定義陣列長度為10

(2)t = a[6];  //引用a陣列中序號為6的元素。此時6不代表陣列長度。

#include <stdio.h>
int main()
{
    int array[5] = {5, 10, 2, 15, 60};  //定義名為array的陣列長度為5
    int i, j, a;

    for(j = 0; j < 4; j++)
        for(i = 0; i < 5 - j; i++)
        {
            if(array[i] > array[i+1])
               {
                a = array[i];  //把陣列的第i個元素賦值給a
                array[i] = array[i+1];
                array[i+1] = a;  
               }
        }
    printf("the sorted numbers:\n");
    for(i = 0; i < 5; i++)
      printf("%3d",array[i]);
      printf("\n");
    return 0;
}定義名為array的陣列長度為5
    int i, j, a;

    for(j = 0; j < 4; j++)
        for(i = 0; i < 5 - j; i++)
        {
            if(array[i] > array[i+1])
               {
                a = array[i];  //把陣列的第i個元素賦值給a
                array[i] = array[i+1];
                array[i+1] = a;  
               }
        }
    printf("the sorted numbers:\n");
    for(i = 0; i < 5; i++)
      printf("%3d",array[i]);
      printf("\n");
    return 0;
}

1.3 陣列在記憶體的儲存方式

陣列在記憶體中就是一段連續的記憶體空間。

二、二維陣列

2.1 二維陣列定義

表現形式: 型別說明符 陣列名[常量表達式][常量表達式];

eg:float a[3][4],b[5][10];   //定義a為3*4(3行4列)的陣列,b為5*10(5行10列)的陣列。注意不能寫成:float a[3,4],b[5,10];這3個元素為a[0]、a[1]、a[2],每個元素又是一個包含4個元素的一維陣列,如下圖:

  可以把a[0],a[1],a[2]看作是3個一維陣列的名字。

上面定義的二維陣列可以理解為定義了3個一維陣列,即相當於:

    float a[0][4],a[1][4],a[2][4];  //此處可以把a[0]、a[1]、a[2]看作一維陣列名。

   注: 二維陣列可被看作是一個特殊的一維陣列:它的元素又是一個一維陣列。C語言中,二維陣列中元素排列的順序是按行存放的,即在記憶體中先順序存放第一行的元素,再存放第二行的元素。及從左到右先a00->a01->a02->a03->a10...->a23. 

2.2 二維陣列的引用

表現形式陣列名[下標][下標];      

    eg:a[2][3];   //下標可以是整型表示式,如a[2 - 1][2 * 2 - 1]。

陣列元素可以出現在表示式中,也可以被賦值,例如: b[1][2] = a[2][3] / 2;

2.3 二維陣列的初始化

(1)分行給二維陣列賦初值。

    int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

(2)也可以將所有資料寫在一個花括號裡

    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};  //不如第一種方法好

(3)對部分元素賦初值

    int a[3][4] = {{1},{2},{3}};這樣三行的第一個元素分別為1,2,3.其餘值為0。

或者 int a[][4] = {{0,0,3}, {}, {1,10}};

    

三、字元陣列

3.1 字元陣列初始化

1)char array[100] = {'a', 'b', 'c', 'd'};  //100表示字串的長度。

2)等價於char array[100] = "abcd"; //後面沒賦值的元素在這裡不顯示

    注:字元陣列中字串的有效字串小於字串長度([]中的數)時,多的長度不顯示,不像整型那樣要用0補齊。

3)char array[] = "hello\n"; //有效長度為6,多了一個結束標誌‘\0’.

    若定義一個字串陣列的時候,沒寫陣列的長度/維數,那c語言編譯器會自動根據字串的長度自動填寫。

4)char array[20] = {0};//定義一個空陣列。

int main9()
{
    int num = 0;  //字串中字元的數量
    int len = 0;  //表示字串的長度

    char buf[100] = "你"; //計算該字串長度,即位元組數量
    while(buf[len++]);
    len--;  //在while迴圈過程中len被多計了一次,所以要減掉
    printf("The length of buf:%d\n",len); //測一個字的長度,linux中一個漢字佔3個位元組,一個字母1個位元組

    char buf1[100] = "你好世界abf";  //計算該字串有幾個字元
    while(buf1[len])
    {
        if(buf1[len] < 0)
            len += 2;
        len++;
        num++;
    }
    printf("num = %d\n",num);

    return 0;
}字串中字元的數量
    int len = 0;  //表示字串的長度

    char buf[100] = "你"; //計算該字串長度,即位元組數量
    while(buf[len++]);
    len--;  //在while迴圈過程中len被多計了一次,所以要減掉
    printf("The length of buf:%d\n",len); //測一個字的長度,linux中一個漢字佔3個位元組,一個字母1個位元組

    char buf1[100] = "你好世界abf";  //計算該字串有幾個字元
    while(buf1[len])
    {
        if(buf1[len] < 0)
            len += 2;
        len++;
        num++;
    }
    printf("num = %d\n",num);

    return 0;
}

3.2 字串和字串結束標誌

    c語言中,是將字串作為字元陣列來處理的。通常人們只關心字串的有效長度,而不是字串長度。所以c語言中規定了一個“字串結束標誌”:'\0'。其表示字串結束,其前面的字元組成字串輸出。

3.3 字元陣列的輸入輸出

   3.3.1  字元陣列輸入輸出的兩種方式:

    1)逐個字元輸入輸出。用格式符“%c”輸入或輸出一個字元,如下圖的第二種方式。

    2)將整個字串一次輸入或輸出。用“%s”格式符。見下圖第一種方式。

     char b[10] = "abc";  //整個字串一次輸出
     printf("{%s}\n",b);  //注意用%s格式符輸出字串時,printf函式中的輸出項是字元陣列名b,而不是陣列元素名b[i]

     char b1[100] = {'I', ' ', 'a', 'm',  ' ', 'a', ' ', 'b', 'o', 'y', '!'};  //逐個字元輸入輸出
     for(i = 0; i < 12; i++)
      {
        printf("%c",b1[i]);
      }
     printf("\n");
/整個字串一次輸出
     printf("{%s}\n",b);  //注意用%s格式符輸出字串時,printf函式中的輸出項是字元陣列名b,而不是陣列元素名b[i]

     char b1[100] = {'I', ' ', 'a', 'm',  ' ', 'a', ' ', 'b', 'o', 'y', '!'};  //逐個字元輸入輸出
     for(i = 0; i < 12; i++)
      {
        printf("%c",b1[i]);
      }
     printf("\n");

   3.3.2  如果利用一個scanf函式輸入多個字串,在輸入時以空格分隔,以回車鍵作為輸入完成的標誌,但回車鍵本身並不作為字串的一部分。例如:

char str1, str2, str3;
scanf("%s%s%s",str1, str2, str3);  //注:scanf函式中的輸入項如果是字元陣列名,則不要再地址符&注:scanf函式中的輸入項如果是字元陣列名,則不要再地址符&

用鍵盤輸入:

How are you?回車

顯示:

How are you?

    3.3.3 scanf函式會將回車、空格都認為是字串輸入結束標誌。

比如:鍵盤輸入:hello word!

顯示的是:hello
空格後面的內容都沒了

    要解決這種問題需要用到gets()函式

3.4 字串處理函式

3.4.1 gets函式:gets(字元陣列) //輸入函式,類似於scanf函式

   注意:

1)  gets函式認為回車輸入結束標誌空格不是。所以用gets函式就可以實現輸入帶空格的字串

2)gets和scanf一樣有緩衝區溢位的問題。

3)gets不能用"%s"或者"%d"之類的字元轉義,只接受字串的輸入。即用gets函式輸入的資訊都是字串型別,你輸入4,也是一個char型別的。

4)gets和puts函式只能輸入一個字串,

gets(str);

不能寫成

gets(str1, str2);

5)上面gets(str);的結果如下:

從鍵盤輸入:It is a computer回車

輸出顯示:It is a computer

3.4.2 fgets函式:fgets(字元陣列)

    1)gets函式不檢查預留緩衝區是否能夠容納使用者實際輸入的資料,多出來的字元會導致記憶體溢位。

    2)fgets函式改進了這個問題,它會將緩衝區溢位的位元組去掉。呼叫fgets函式的時候,只要保證第二個引數小於陣列實際的大小,就可以避免緩衝區溢位。

    3)缺點:fgets函式是為讀取檔案設計的,所以讀取鍵盤時沒有gets那麼方便

char s[100] = {0};
fgets(s, sizeof(s), stdin);  //固定格式。第一個引數是char的陣列名,第二個引數是陣列的大小。單位:位元組。第三個引數stdin代表標準輸入的意思char的陣列名,第二個引數是陣列的大小。單位:位元組。第三個引數stdin代表標準輸入的意思

    4)第二個引數sizeof(s)表示陣列的大小,還可以用具體數值表示,但一旦陣列大小改變,fgets也要改,所以用sizeof(s)更方便。

3.4.3 puts函式:puts(字元陣列名)//將字串輸出到終端,類似於printf。

puts函式自動會在輸出完成之後列印一個'\n'出來。

#include <stdio.h>
int main(void)  //puts/fgets輸入/輸出字串
{
    char a[100] = {0};
    fgets(a, sizeof(a), stdin);

    puts(a);
    return 0;
}//puts/fgets輸入/輸出字串
{
    char a[100] = {0};
    fgets(a, sizeof(a), stdin);

    puts(a);
    return 0;
}

結果:

輸入上面的“hello world”字串,下面用puts函式輸出結果。

注:gets和puts函式只用於輸入輸出字串

3.4.4 strcat函式:strcat(字元陣列1,字元陣列2); //字串追加

    連線兩個字元陣列中的字串,把字串2接到字串1的後面,結果放在字元陣列1中。所以陣列1的長度一定要留的足夠大。

int main()
{
    char str1[50] = "hello";
    char str2[] = " world!";
    printf("%s\n",strcat(str1, str2));  //合併兩個字串,將後一個字串放到第一個字串後面
    return 0;
}//合併兩個字串,將後一個字串放到第一個字串後面
    return 0;
}

3.4.5 strncat函式:strncat(字元陣列1,字元陣列2, 追加數量); //字串有限追加

“追加數量”:在合併的時候可以限制追加多少個字元

#include <stdio.h>
#include <string.h>

int main2() //strncat合併時可限制追加多少字元
{
   char a[20] = "hello world";

   char str2[50] = "!1234567894579595";
   printf("%s\n",strncat(a, str2, 5));  //合併時可限制追加多少字元
   return 0;

}

3.4.5 strlen函式:strlen(字元陣列名);  //求字串的實際長度

    使用這個庫函式要先加

#include <string.h>
int main2()
{
   char a[100] = "hello world";
   int len = strlen(a);
   printf("len =%d\n",len);  //求字串的實際長度
   printf("%d\n",sizeof(a));//求整個字串陣列的長度
   return 0;
}strlen(a);
   printf("len =%d\n",len);  //求字串的實際長度
   printf("%d\n",sizeof(a));//求整個字串陣列的長度
   return 0;
}

第二個100是用sizeof函式求出來的

3.5 隨機數產生函式rand和srand

    標頭檔案 stdlib.h

    rand是隨機數產生器,每次呼叫產生的隨機數是一樣的。

    若呼叫rand之前先呼叫srand才能出現任意隨機數。只要保證每次呼叫srand函式的時候,引數的值是不同的,那麼rand函式就一定會產生不同的隨機數。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    time_t tm = time(NULL);//得到系統時間
    printf("tm =%u\n",tm);

    srand(tm);//隨機數種子發生器
    int i = 0;
    for(i = 0; i < 10; i++)//控制產生的隨機數的數量
    {
       int value = rand();//隨機數產生器
       printf("%d\n",value);
    }

    return 0;
}/得到系統時間
    printf("tm =%u\n",tm);

    srand(tm);//隨機數種子發生器
    int i = 0;
    for(i = 0; i < 10; i++)//控制產生的隨機數的數量
    {
       int value = rand();//隨機數產生器
       printf("%d\n",value);
    }

    return 0;
}