C에서 문자 배열의 길이 가져 오기

Jinku Hu 2023년10월12일
  1. sizeof연산자를 사용하여 문자 배열의 길이 찾기
  2. strlen함수를 사용하여 문자 배열의 길이 찾기
C에서 문자 배열의 길이 가져 오기

이 기사에서는 C에서char배열의 길이를 가져 오는 몇 가지 방법을 설명합니다.

sizeof연산자를 사용하여 문자 배열의 길이 찾기

배열 크기는 요소 데이터 유형에 관계없이sizeof연산자를 사용하여 계산할 수 있습니다. 그러나 배열의 크기를 측정 할 때 내부 세부 사항을 무시하면 끔찍한 오류가 발생할 수 있습니다.

즉, 다음 예제는arrarr2라는 두 개의 배열을 다른 표기법으로 초기화합니다. 그런 다음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을 호출하면arrarr2모두에 대해 반복이 발생합니다. 첫 번째 배열이 널 바이트로 종료되지 않고 컴파일러가 그 뒤에 계속해서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
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 Facebook

관련 문장 - C Char