指標和陣列學習筆記1
阿新 • • 發佈:2020-12-27
中文字元在系統中的儲存模式
#include <stdio.h> int main() { char str[] = "中"; int length, i; length = sizeof(str) / sizeof(str[0]); printf("length of str: %d\n", length); for (i = 0; i < length; i++) { printf("str[%d] = %d\n", i, str[i]); } return 0;
執行結果:
發現,每個中文字元在我們的系統中是佔用 4 個位元組的儲存空間,並且都是負數。
所以在要計算字串中中文字元的個數時,我們先判斷字元對應的整型值是否位負數(用(int)強制轉化符);然後再將指標向後移動兩個位元組。(char 型別在系統中佔2個位元組)
例如 實現連線字串 —— strcat 和 strncat 函式
#include <stdio.h> #define MAX 1024 int main() { char str1[2 * MAX]; // 確保連線後不越界 char str2[MAX]; char *target1 = str1; char *target2 = str2; char ch; int n; printf("請輸入第一個字串:"); fgets(str1, MAX, stdin); printf("請輸入第二格字串:"); fgets(str2, MAX, stdin); printf("請輸入需要連線的字元個數:"); scanf("%d", &n); // 將指標指向 str1 的末尾處 while (*target1++ != '\0') ; // 我們希望 str1 最後邊的 '\0' 和 '\n' 都被覆蓋掉 target1 -= 2; while (n--) { ch = *target1++ = *target2++; if (ch == '\0') { break; } if ((int)ch < 0) { *target1++ = *target2++; *target1++ = *target2++; } } *target1 = '\0'; printf("連線後的結果是:%s\n", str1); return 0; }
上面是魚C的程式碼
下面是自己寫的程式碼
#include<stdio.h> #define MAX 1024 int main() { int i, n; char ch; char str1[MAX], str2[MAX]; char *target1 =str1; char *target2 =str2; printf("請輸入第一個字串:"); fgets(str1, MAX, stdin); printf("請輸入第二個字串:\n"); fgets(str2, MAX, stdin); printf("請輸入需要連線的字元個數:\n"); scanf("%d", &n); while (*target1++ != '\0') ; target1 -= 2; // fgets會接收到回車'\',所以我們減去'\'和'\0' // for (i = 0; i < n; i++) // 自己使用的for迴圈語句,上面的應該更簡單一些 // { ch = *target1++ = *target2++; if (ch == '\0') { break; } if ((int)ch < 0); *target1++ = *target2++; *target1++ = *target2++; // 中文字元佔用4個位元組,指標往後移動兩位 // } *target1 = '\0'; printf("連線後的結果:%s\n", str1); return 0; }
這是學完22課陣列和指標的,感覺需要記錄的東西。