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),
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