目前為止, 我們已經用過很多與字串(string)有關的 Library functions!
包括 strlen, strcmp, strcpy, strcat, 以及 strncpy 等等;
也給過大家九個可以算出字串長度(strlen)的不同寫法!
想一想, 在處理字串 s 時, 你會需要對字串 s 做哪些事?

要了解 C 的字串處理, 首先要知道, C 的字串是  NULL_terminated!
啥意思? 
  就是說字串可由記憶體任何地方開始, 且是用一個 NULL 結束字串!
    NULL 就是一個所有 bit 都是 0 的 Byte, 它的值就是 0 啦!
    有時候故意寫成  '\0'   (注意是單引號; 雙引號是字串)
 通常寫  #define  NULL  0
  若寫  '0'  則其 ASCII 值是 48, 不是 0 所以不是 NULL
  要記起來: 'A' 的ASCII 值是 65; 'a' 的ASCII 值是 97;
 FYI:  '\n' 的 ASCII 值是 10;  '\r' 的 ASCII 值是 13;
        '\n' 又叫做 New Line; 或 Line Feed 換列或換行;
         '\r' 又叫做 RETURN 或 Carriage RETURN ; 歸位或回車
        '\t' 的 ASCII 值是 9;  代表 Tab 又叫做 Control_I
           Control_I 代表往右跳個幾格到固定倍數格 (例如 8 的倍數)
        '\v' 的 ASCII 值是 ? , 自己查, 它代表垂直往下跳個幾 lines
   ** 以上這些怪咚咚跟空白  ' ' 類似印出來都看不見,
     合稱廣義空白 (white space; 白色空白; 或簡稱空白);
     可用程式庫 isspace(x) 查出  x 是否為 white space ?
所以,
字串就是很多字元(Character)連起來, 每個 char 佔一 Byte(位元組)!
每個 Byte 目前幾乎都是 8 bits(位元 ) (以前有 6 bits, 7 bits的)

char s[999], t[999];  // s 和 t 都佔用 999 Bytes
strcpy(t, s);   // 把 s 全部 copy 到 t; 萬一 t 不夠位置是你家的事!

char* strcpy(char* t, char* s);  // 宣告於 <string.h>
int myStrFun(char * s);   // 可以對 s 做些啥事呢?

想一想, 在處理字串 s 時, 你會需要對字串 s 做哪些事? ? ?

  1. 字串長度   int strlen(char*s);
  2. 比較字串   int strcmp(char*sa, char*sb);  // < 0, 0, > 0

  3. copy字串   char* strcpy(char*t, char*s);   // copy s into t
  4. 串接字串   char* strcat(char*t, char*s);  // t = t+s; 接起來

  5. 限制版 (3)copy字串   char* strncpy(char*t, char*s, int n); 
  6. 限制版 (4)串接字串   char* strncat(char*t, char*s, int n);

  7. 找字串     char* strstr(char* str, char* pat);
  8. 找 char    char* strchr(char* str, int c);

  9. 從尾巴找的 (7)   char* strrstr(char* str, char* pat);
 10. 從尾巴找的 (8)   char* strrchr(char* str, int c);

 11. 切 token  char *strtok(char *str, const char *delim); 
      ^^^^^^^^  很重要 !! 但是看 Manual 有點難懂, 以後會給範例 !
     通常已經換成  strsep( ); 
如果有 strsep( ) 就不要用 strtok( )
====== 以上十一項都是程式庫中已經有的函數  (宣告於 <string.h>內)

 12. 子字串 substring  歹勢, C Library 沒提供, 要自己寫 !

  ?? 想一想 .. 還可以做啥?  還想要對字串做啥?  擠掉空白??

     (P.S. Java 的程式庫對字串處理有提供更多的函數!)

char* substr(char* str, int begin, int len) {
              // MID$(str, begin, len)
   char* p;
   if (str == 0) return 0;  // address 0 是禁區 ! 防呆一下 :-)
   if(str[0] == 0) return str;  // Empty string
   p = malloc(len+1);  // new a space in Heap area
   p[len] = 0;
   strncpy(p, str+begin, len);  // 最多 copy len 個 char 到 p
   return p;
} // substr(