字串是計算機程式設計中表示文字資料的一種基本資料型別,在C語言中,字串是以字元陣列的形式實現的,並且每個字串都以空字元\0
結尾,這個空字元標誌著字串的結束。
下面從基礎到深入講解字串的相關知識點:
1. 字串的定義與表示
-
字串在C語言中使用字元陣列表示,例如:
char str[10] = "hello"; // 包含'h', 'e', 'l', 'l', 'o', '\0'
這裡的
str
可以容納10個字元,但只用了6個,包括了最後的空字元\0
。 -
另一種寫法:
char str[] = "world"; // 長度由編譯器自動計算
2. 輸入和輸出字串
-
輸出字串:使用
printf
函式。printf("%s", str);
-
輸入字串:使用
scanf
或gets
函式(注意安全問題)。char str[50]; scanf("%s", str); // 注意:scanf無法讀取空格後的內容。
推薦使用
fgets
讀取一整行,包括空格:fgets(str, 50, stdin); // 從輸入讀取最多49個字元,並新增'\0'
3. 常見的字串操作函式
這些函式都在<string.h>
中定義,常用的有:
函式 | 功能 |
---|---|
strlen(s) |
計算字串的長度(不包括\0 )。 |
strcpy(dest, src) |
將字串src 複製到dest 中。 |
strcat(dest, src) |
將字串src 追加到dest 的末尾。 |
strcmp(s1, s2) |
比較兩個字串(返回0表示相等)。 |
strstr(s1, s2) |
查詢字串s2 在s1 中的第一次出現位置。 |
例子:
#include <stdio.h>
#include <string.h>
int main() {
char s1[20] = "Hello";
char s2[] = "World";
// 字串拼接
strcat(s1, s2);
printf("拼接後: %s\n", s1); // 輸出: HelloWorld
// 計算長度
printf("長度: %lu\n", strlen(s1)); // 輸出: 10
// 字串比較
if (strcmp(s1, s2) == 0) {
printf("字串相等\n");
} else {
printf("字串不相等\n");
}
return 0;
}
4. 字串的常見操作
1)反轉字串
#include <stdio.h>
#include <string.h>
void reverse(char str[]) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = temp;
}
}
int main() {
char str[] = "hello";
reverse(str);
printf("反轉後的字串: %s\n", str); // 輸出: olleh
return 0;
}
2)查詢字元
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello";
char *pos = strchr(str, 'l'); // 查詢'l'的第一次出現
if (pos) {
printf("字元'l'第一次出現的位置: %ld\n", pos - str);
}
return 0;
}
3)分割字串
使用strtok
函式:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "C,is,a,programming,language";
char *token = strtok(str, ",");
while (token) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
return 0;
}
輸出:
C
is
a
programming
language
5. 注意事項
-
記憶體越界:定義字串時,必須留出足夠的空間儲存字元和
\0
。char str[5] = "hello"; // 錯誤:無法儲存最後的'\0'
-
安全輸入:避免
gets
,推薦fgets
以防止緩衝區溢位。 -
動態分配記憶體:如果字串長度不確定,可以使用動態記憶體分配。
char *str = (char *)malloc(50 * sizeof(char)); strcpy(str, "dynamic"); printf("%s\n", str); free(str);
6. 小練習
試著實現以下功能:
- 手動實現
strlen
函式。 - 手動實現字串拼接(類似
strcat
)。 - 判斷一個字串是否是迴文。
如果需要更詳細的講解或程式碼實現,歡迎繼續提問! 😊