1. 程式人生 > 其它 >指標和陣列學習筆記1

指標和陣列學習筆記1

技術標籤:筆記指標字串

中文字元在系統中的儲存模式

#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 個位元組的儲存空間,並且都是負數
發現,每個中文字元在我們的系統中是佔用 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課陣列和指標的,感覺需要記錄的東西。