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

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

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

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

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.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 <stdio.h>
#include <stdlib.h>
#include <string.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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C Char