C 語言中字串以空字元 \0 結尾的 char 陣列形式存在。
字串常值(字串字面值)是雙引號括起的字元序列,編譯器自動在末尾附加 \0。相鄰字串常值會被連接:"How are" "you" 等同 "How are you"。字串中需包含雙引號時用 \" 轉義。字串常值屬靜態儲存類別,程式執行期間只儲存一份。
宣告陣列大小須確保至少比字串長度多 1(留給 \0)。未使用元素自動初始化為 0(即 \0)。陣列名同樣是首元素地址。
char heart[] = "I love Tillie!";
char *head = "I love Millie!";
核心差異:heart 是常數(陣列名),head 是變數(指標)。兩者皆可用下標與指標算術,但只有指標可用遞增運算子。陣列元素可修改,陣列名不可修改。宣告指標時加 const 可防止意外修改字串內容。const char *mytal1[5] 是指標陣列(存 5 個地址),char mytal2[5][81] 是二維字元陣列(存 5 個完整字串)。
\0,返回指標或 NULL。不安全,無緩衝區長度檢查。n,最多讀 n-1 字元或遇換行為止;保留換行字元;第三參數指定輸入流(鍵盤用 stdin)。stdout),不自動換行。void put1(const char *string) {
while (*string != '\0') putchar(*string++);
// 熟練者可簡寫為 while (*string) putchar(*string++);
}
| 函式 | 功能 | 備註 |
|---|---|---|
| strlen(s) | 回傳字串長度(不含 \0) | |
| strcat(s1, s2) | 將 s2 附加到 s1 末尾 | s1 需有足夠空間,回傳 s1 |
| strncat(s1, s2, n) | 最多附加 n 字元 | 遇 \0 停止 |
| strcmp(s1, s2) | 比較字串(機器編碼順序) | 先於負值、相等 0、後於正值 |
| strncmp(s1, s2, n) | 最多比較 n 字元 | |
| strcpy(s1, s2) | 複製 s2 到 s1 | 回傳 s1,可複製部分陣列 |
| strncpy(s1, s2, n) | 最多複製 n 字元 | 不足補 \0,超過不加 \0 |
| sprintf(s, fmt, ...) | 格式化寫入字串 | 類似 printf 但輸出到字串 |
int main(int argc, char *argv[]) {
// argc 含程式名在內的參數個數
// argv[0] 為程式名,argv[1]... 為各參數
}
執行 repeat "I am hungry" now 時 argc = 3(雙引號將中間合為一參數)。
long strtol(const char *nptr, char **endptr, int base);
double strtod(const char *nptr, char **endptr);
base 指定進制(10 進制、16 進制等)。endptr 指向轉換結束處的字元。例如 "10atom" 在 base 10 時轉為 10,endptr 指向 'a';base 16 時 'a' 視為有效十六進位數字,轉為 266。