C의 문자열 배열

Jinku Hu 2023년10월12일
  1. 2D 배열 표기법을 사용하여 C에서 문자열 배열 선언
  2. char *배열 표기법을 사용하여 C에서 문자열 배열 선언
C의 문자열 배열

이 기사에서는 C에서 문자열 배열을 선언하는 방법에 대한 여러 방법을 보여줍니다.

2D 배열 표기법을 사용하여 C에서 문자열 배열 선언

C의 문자열은 인접한 메모리 영역에 저장된 chars의 시퀀스입니다. 문자열에 대한 한 가지 차이점은 시퀀스의 끝에 저장되는 종료 널 바이트 \0이 있다는 것입니다. 이는 한 문자열의 끝을 나타냅니다. []표기법을 사용하여char의 고정 배열을 선언하면 해당 위치에 동일한 수의 문자로 구성된 문자열을 저장할 수 있습니다.

문자열을 배열 위치로 복사 할 때 종료 널 바이트에 대한 하나의 추가 문자 공간을 고려해야합니다. 따라서 대괄호 표기법으로 2 차원 char배열을 선언하고이를 문자열 배열로 활용할 수 있습니다. 배열의 두 번째 차원은 문자열의 최대 길이를 제한합니다. 이 경우 100 자에 해당하는MAX_LENGTH 매크로 상수를 임의로 정의합니다. 전체 배열은 배열의 각 char요소를 0으로 만드는 {""}표기법으로 초기화 할 수 있습니다. 이미 초기화 된 배열에 문자열 값을 저장할 때 할당 연산자는 허용되지 않으며strcpy와 같은 특수 메모리 복사 기능을 사용해야합니다.

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

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char arr[NUM_STRINGS][MAX_LENGTH] = {""};

  arr2[0] = "string literal";  // Not permitted
  strcpy(arr[0], "hello world");
  printf("%s\n", arr[0]);
  printf("%s\n", strcpy(arr[0], "hello world"));

  exit(EXIT_SUCCESS);
}

출력:

hello world
hello world

또는 선언 된 즉시 2 차원 char배열을 초기화 할 수 있습니다. 최신 C11 표준은 문자열 리터럴로char 배열을 초기화하고 배열 길이가 문자열 자체보다 클 때 자동으로 문자열 끝에 null 바이트를 저장할 수 있습니다. 이니셜 라이저 목록 표기법은 C++ 구문과 유사합니다. 각 중괄호 요소는 MAX_LENGTH길이의 연속 메모리 영역에 저장됩니다. 이니셜 라이저 표기법이 배열 크기보다 적은 수의 요소를 지정하는 경우 나머지 요소는 \0바이트로 암시 적으로 초기화됩니다.

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

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char arr2[NUM_STRINGS][MAX_LENGTH] = {{"first string"},
                                        {"second string"},
                                        {"third string"},
                                        {"fourth string"},
                                        {"fifth string"}};

  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr2[i]);
  }

  exit(EXIT_SUCCESS);
}

출력:

first string, second string, third string, fourth string, fifth string, , , , , ,

char *배열 표기법을 사용하여 C에서 문자열 배열 선언

char *는 일반적으로 문자열을 저장하는 데 사용되는 유형입니다. char *배열을 선언하면 동일한 수의 문자열을 가리키는 고정 된 수의 포인터가 제공됩니다. 다음 예제와 같이 문자열 리터럴로 초기화 할 수 있으며 string.h헤더에 제공된 특수 함수를 사용하여 할당하거나 복사 할 수 있습니다.

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

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char* arr3[NUM_STRINGS] = {"first string", "second string", "third string",
                             "fourth string", "fifth string"};
  char* str1 = "string literal";
  arr3[8] = str1;
  arr3[9] = "hello there";

  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr3[i]);
  }
  printf("\n");

  exit(EXIT_SUCCESS);
}

출력:

first string, second string, third string, fourth string, fifth string, (null), (null), (null), string literal, hello there,

대안으로 배열의 포인터를 null로 초기화하는 {}중괄호 만 지정할 수 있으며 나중에 다른 문자열 주소를 저장하는 데 사용할 수 있으며 프로그래머가 동적 메모리를 할당 할 수도 있습니다.

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

#define NUM_STRINGS 10

int main() {
  char *arr4[NUM_STRINGS] = {};
  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr4[i]);
  }
  printf("\n");

  exit(EXIT_SUCCESS);
}

출력:

(null), (null), (null), (null), (null), (null), (null), (null), (null), (null),
작가: 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 Array

관련 문장 - C String