目前為止, 我們已經用過很多與字串(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); // 宣告於 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( ) ====== 以上十一項都是程式庫中已經有的函數 (宣告於 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(