在 C 語言中獲取字元陣列的長度
Jinku Hu
2023年10月12日
本文將介紹幾種在 C 語言中獲取 char
陣列長度的方法。
使用 sizeof
運算子來查詢字元陣列的長度
陣列的大小可以用 sizeof
運算子計算,而不考慮元素的資料型別。不過,在測量陣列大小時,如果忽略內部細節,可能會出現一些可怕的錯誤。
也就是說,下面的例子是用不同的符號初始化兩個名為 arr
和 arr2
的陣列。然後使用 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
的結果是同時迭代 arr
和 arr2
,因為第一個陣列不是以空位元組結束的,編譯器在它之後連續儲存 arr2
,結果大小等於兩個陣列之和減 1(丟棄終止的空位元組)。
注意,我們實現的 lengthOfArray
函式模仿了 strlen
的計數行為,結果也是一樣的數字。對於第二個陣列物件-arr2
,strlen
返回的是沒有最後一個空位元組的列印字元數,這在某些情況下是有用的,但它並不代表陣列的實際大小。
#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