字符串操作函數的實現----字符串拼接
1 #include <stdio.h> 2 3 // 求字符串長度 4 int getLength(char *str) { 5 6 int len; 7 for (len = 0; str[len]!= '\0'; len++); 8 9 return len; 10 } 11 12 13 // 字符串拼接函數實現, 將str2拼接到str1后 14 char *myStrcat(char *str1, char *str2) { 15 int len = getLength(str1); // 字符串str1的長度 16 int i, j; 17 18 for (i = len, j = 0; str2[j] != '\0'; i++, j++) { 19 str1[i] = str2[j]; 20 } 21 22 str1[i] = '\0'; // 手動添加字符串結束標志 23 24 return str1; 25 } 26 27 int main() { 28 29 char s1[100]="abcd"; 30 char s2[40]="efgh"; 31 char *p = s1; 32 33 p = myStrcat(s1, s2); // 數組名是常量, 不可以做左值 34 35 printf("s1 = %s\n", s1); 36 printf("s2 = %s\n", s2); 37 printf("s1 + s2 = %s\n", p); 38 39 return 0; 40 }
運行結果:
注意事項:
0° main函數中的測試字符串s1不能定義成char *s1 = "abcd"的形式, 這種定義方式只是聲明一個char型的指針變量指向字符串 "abcd", 而並沒有開辟內存空間, 不能進行拼接.
1° 在myStrcat函數中拼接動作完成后需要手動添加一個字符串結束標志'\0'.
2° 字符數組s1的容量要足夠大, 容量至少應是兩字符串實際長度的和.
思考(僅僅個人觀點):
曾嘗試過在myStrcat()函數中事先判斷字符串s1的容量, 但考慮到字符數組做函數參數時會退化成指針, 用getLength()函數獲取長度只能得到它的實際有效長度而無法獲取字符數組的容量.
也就是說在主函數中定義的s1[100], 將s1作為參數傳進去, 就退化為指針了, 所以你無論是借助sizeof還是strlen都無法得知它的容量.