String 字串
## C 的 String(字串)觀念
C 語言**沒有內建的 `string` 型別**。C 的字串通常是由 `char` 陣列組成,並且在字串結尾加上特殊字元:
```c
'\0'
```
這個字元稱為 **Null terminator(字串結束字元)**。
例如:
```c
char word[] = "Hello";
```
實際上記憶體內容如下:
```text
'H' 'e' 'l' 'l' 'o' '\0'
```
因此 `"Hello"` 需要 6 個 `char` 空間,而不是 5 個。
### 常見宣告方式
```c
char s1[] = "Hello"; // 可修改內容,大小自動計算
char s2[20] = "Hello"; // 可修改內容,預留 20 個字元
char s3[] = {'H', 'i', '\0'};
```
---
## 常見字串操作
使用以下函式時,通常需要:
```c
#include <string.h>
```
| 函式 | 功能 |
|---|---|
| `strlen(s)` | 取得字串長度,不包含 `'\0'` |
| `strcpy(dest, src)` | 複製字串 |
| `strcat(dest, src)` | 將字串接到另一字串後面 |
| `strcmp(s1, s2)` | 比較兩個字串 |
| `strchr(s, c)` | 尋找字元 |
| `strstr(s1, s2)` | 尋找子字串 |
輸出字串時使用:
```c
printf("%s", str);
```
注意:字串陣列的容量必須足夠容納內容以及最後的 `'\0'`,否則可能造成緩衝區溢位。
---
## 範例 1:輸入字串並計算長度
```c
#include <stdio.h>
#include <string.h>
int main(void) {
char name[50];
printf("請輸入姓名:");
fgets(name, sizeof(name), stdin);
// 移除 fgets 讀入的換行字元
name[strcspn(name, "\n")] = '\0';
printf("你好,%s!\n", name);
printf("字串長度為:%zu\n", strlen(name));
return 0;
}
```
重點:
- `fgets()` 可以限制最多讀取的字元數,比 `gets()` 安全。
- `strlen()` 不計算結尾的 `'\0'`。
- `strcspn(name, "\n")` 可找出換行字元的位置。
---
## 範例 2:複製與串接字串
```c
#include <stdio.h>
#include <string.h>
int main(void) {
char message[50];
strcpy(message, "Hello");
strcat(message, ", C language!");
printf("%s\n", message);
printf("長度:%zu\n", strlen(message));
return 0;
}
```
執行結果可能是:
```text
Hello, C language!
長度:17
```
在這個範例中:
```c
strcpy(message, "Hello");
```
先將字串複製到 `message`。
```c
strcat(message, ", C language!");
```
再將另一個字串接到 `message` 後面。
使用 `strcpy()` 和 `strcat()` 時,目的陣列一定要有足夠空間,否則可能導致記憶體錯誤。
相關學習地圖、教學課程
C 語言,系統程式