在 C 語言中獲取字元陣列的長度

Jinku Hu 2023年1月30日 2021年2月28日
  1. 使用 sizeof 運算子來查詢字元陣列的長度
  2. 使用 strlen 函式查詢字元陣列的長度
在 C 語言中獲取字元陣列的長度

本文將介紹幾種在 C 語言中獲取 char 陣列長度的方法。

使用 sizeof 運算子來查詢字元陣列的長度

陣列的大小可以用 sizeof 運算子計算,而不考慮元素的資料型別。不過,在測量陣列大小時,如果忽略內部細節,可能會出現一些可怕的錯誤。

也就是說,下面的例子是用不同的符號初始化兩個名為 arrarr2 的陣列。然後使用 sizeof 運算子檢索兩個陣列的大小,並列印到控制檯。

請注意,第二個陣列的大小等於 18 個位元組,儘管只有 17 個列印元素。這個問題的原因隱藏在初始化方法中,即當 char 陣列使用字串字面值初始化時,終止的 null 位元組也被儲存為陣列的一部分。因此,sizeof 運算子將這個位元組包含在所有元素的和中,並返回相應的結果。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void printCharArray(char *arr, size_t len)
{
    for (size_t i = 0; i < len; ++i) {
        printf("%c, ", arr[i]);
    }
    printf("\n");
}

int main(int argc, char *argv[]){
    char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
    char arr2[] = "array initialized";

    printCharArray(arr, sizeof arr);
    printf("size = %lu bytes \n", sizeof arr);

    printf("\n");

    printCharArray(arr2, sizeof arr2-1);
    printf("size = %lu bytes \n", sizeof arr2);

    exit(EXIT_SUCCESS);
}

輸出:

a, b, c, d, e, f, g,
size = 7 bytes
size = 24 bytes

a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, e, d,
size = 18 bytes
size = 17 bytes

使用 strlen 函式查詢字元陣列的長度

在某些情況下,可以使用 C 標準庫字串實用程式中的 strlen 函式來測量被初始化或儲存為空端字元字串的 char 陣列的大小。

如果我們用 strlen 計算值執行前面的示例程式碼,我們會得到由不同問題引起的不同數字。第一個-arr 物件大小被列印成 24 個位元組,因為 strlen 函式會在一個 char 陣列中迭代,直到遇到終止的 null 位元組。因此,在 arr 物件上呼叫 strlen 的結果是同時迭代 arrarr2,因為第一個陣列不是以空位元組結束的,編譯器在它之後連續儲存 arr2,結果大小等於兩個陣列之和減 1(丟棄終止的空位元組)。

注意,我們實現的 lengthOfArray 函式模仿了 strlen 的計數行為,結果也是一樣的數字。對於第二個陣列物件-arr2strlen 返回的是沒有最後一個空位元組的列印字元數,這在某些情況下是有用的,但它並不代表陣列的實際大小。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void printCharArray(char *arr, size_t len)
{
    for (size_t i = 0; i < len; ++i) {
        printf("%c, ", arr[i]);
    }
    printf("\n");
}

long lengthOfArray(const char *arr)
{
    long size = 0;

    while (*arr) {
        size += 1;
        arr +=1;
    }

    return size;
}

int main(int argc, char *argv[]){
    char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
    char arr2[] = "array initialized";

    printCharArray(arr, sizeof arr);
    printf("size = %lu bytes \n", sizeof arr);
    printf("size = %lu bytes \n", strlen(arr));
    printf("size = %lu bytes \n", lengthOfArray(arr));

    printf("\n");

    printCharArray(arr2, sizeof arr2-1);
    printf("size = %lu bytes \n", sizeof arr2);
    printf("size = %lu bytes \n", strlen(arr2));
    printf("size = %lu bytes \n", lengthOfArray(arr2));

    exit(EXIT_SUCCESS);
}

輸出:

a, b, c, d, e, f, g,
size = 7 bytes
size = 24 bytes
size = 24 bytes

a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, e, d,
size = 18 bytes
size = 17 bytes
size = 17 bytes
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C Char