字串與字元陣列
初寫:2010.02.18, 更新日期:2020.10.25
 
參考資料:
 
  • 前言:

    字串與字元陣列
    C語言的資料型態裡,未提供字串的資料型態,
    有些像是C++有提供string資料型態、培基(BASIC)語言有1Bytes或2Bytes的字串變數。

    C語言是將字串,拆成字元,儲存於陣列,
    換句話說,就是將一個個的字元char,分別儲存到陣列元素中。
    但是C並不會辨識字串何時結束,
    必須在儲存的最後一個字元後一元素,儲存一結束(NULL)字元'\0'。

    若沒有儲存結束字元 '\0' 的陣列,稱之為字元陣列,
    字元陣列會是一連續的記憶體位址,而字串是一筆資料。

    如果使用scanf()裡的 %s 讀取,scanf函式會自動補入 '\0',
    若使用其他字元輸入函式,則需程式設計者自己補上 '\0'。
    使用 "a" 與 'a' 的差別,"a" 就是 'a'+'\0'


  • 宣告與存放

    宣告一字元變數ch,存放一個字元 a.
    char ch='a';

    宣告一個字元陣列,並存入Hello World!
    char myword[]={'H','e','l','l','o',' ','W','o','r','l','d','!'};

    宣告一個字串,尾端補\0的字元,視為字串
    char myword[]={'H','e','l','l','o',' ','W','o','r','l','d','!','\0'};


  • 範例1:
    請執行下列程式,看看結果:
    #include <stdio.h>
    str_print( char myword[] ) //將字元陣列印出的函數
    {
      printf("%c", myword[0]); 
      printf("%c", myword[1]);
      printf("%c", myword[2]);
      printf("%c", myword[3]);
      printf("\n");
    }
    main() {
       char myword[] = {'H','e','l','l','o',' ','W','o','r','l','d','!','\0'};
       str_print( myword );

       return 0;
    }
    是不是只印出部分的字元?
    請試試修改函數和程式,(改以迴圈重複來將字元陣列印出)
    讓這個宣告的字串能完整印出來。



    但是如上述宣告方式,有些繁瑣,所以C的字串使用""括住,
    在宣告時,則會自動在字串的尾端幫你補上'\0'.
    char myword[] = "Hello World!";

    範例2:將範例1中的宣告,換成字串來試試.
    #include <stdio.h>
    str_print( char myword[] ) //將字元陣列印出來的函數
    {
      //...略
      printf("\n");
    }
    main() {
       char myword[] = "Hello World!";
       str_print( myword );

       return 0;
    }
    執行看看結果如何?


    另外,C語言提供string.h的函式庫
    #include <string.h>

    strlen( s ); //傳回目標字串的長度(字元數),不包括'\0'或Null.

    strcpy( s1, s2 ); //字串複製函數, 將s2複製到s1上

    strcmp( s1, s2 ); //比較兩字串s1, s2是否一樣(一個個字元比)

    strcat( s1, s2 ); //將字串s2,串接到 s1後,以s1傳回(需注意s1長度要為strlen(s1)+strlen(s2))


    以下為非標準函數(在Windows(VC, MinGW能用)):

    strupr( s ); //將字串s的字元轉大寫A..Z(非字母不轉換)

    strlwr( s );  //將字串s的字元轉小寫a..z(非字母不轉換)


  • 範例3:
    執行下列程式,觀察執行結果:
    #include <stdio.h>
    #include <string.h>

    main() {
       char str[] = "Hello World!";
       int length = sizeof(str) / sizeof(str[0]);
       int i;
       for(i = 0; i < length; i++) {
          if(str[i]=='\0') printf("\\n");
          else printf("%c", str[i]);
       }
       printf("\n");
       printf("陣列長: %d\n", length);
       printf("字串長: %d\n", strlen(str));

       return 0;
    }


  • 練習1:
    請寫一個程式,可以計算你輸入字串的長度。

    例如: The Length of string: "Hello World!" is 12.

  • 練習2:
    請寫一個程式,將上題字串反轉輸出。

    例如: The reverse of input string: "!dlroW olleH".

曾聖超老師製作