C에서 문자 배열의 길이 가져 오기
이 기사에서는 C에서char
배열의 길이를 가져 오는 몇 가지 방법을 설명합니다.
sizeof
연산자를 사용하여 문자 배열의 길이 찾기
배열 크기는 요소 데이터 유형에 관계없이sizeof
연산자를 사용하여 계산할 수 있습니다. 그러나 배열의 크기를 측정 할 때 내부 세부 사항을 무시하면 끔찍한 오류가 발생할 수 있습니다.
즉, 다음 예제는arr
및arr2
라는 두 개의 배열을 다른 표기법으로 초기화합니다. 그런 다음sizeof
연산자를 사용하여 두 배열의 크기를 검색하고 콘솔에 인쇄합니다.
두 번째 배열 크기는 인쇄 된 요소가 17 개만 있더라도 18 바이트와 같습니다. 이 문제의 원인은 초기화 방법에 숨어 있습니다. 즉,char
배열이 문자열 리터럴 값을 사용하여 초기화 될 때 종료되는 널 바이트도 배열의 일부로 저장됩니다. 따라서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
객체 크기는strlen
함수가 종료 널 바이트를 만날 때까지 char 배열을 반복하기 때문에 24 바이트로 인쇄됩니다. 따라서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
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 Facebook