中文字符在系統中的儲存模式
#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課陣列和指標的,感覺需要記錄的東西,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/240841.html
標籤:其他
