C 언어 문자열과 널 종단 문자 완벽 이해 | 문자 배열 vs 문자열 배열 차이
문자열이란?
프로그래밍에서 문자열(string) 은 문자(char)의 모음이다. 쉽게 말해, 여러 개의 문자가 모여 하나의 단어 또는 문장을 이루는 데이터 타입이다. C 언어에서는 문자열을 특별히 다루는 전용 자료형이 없고, 문자의 배열(char[]) 로 표현한다. 예를 들어, 다음과 같이 문자열을 정의할 수 있다.
char s[] = "HI!";
이 문자열은 메모리에 다음과 같이 저장된다.
H | I | ! | \0 |
여기서 \0(널 종단 문자, Null-terminator)이 마지막에 포함되는 것이 중요하다.
문자열과 문자(char)의 차이
- 문자(char): 한 개의 문자만 저장할 수 있는 데이터 타입. 예를 들어 char c = 'A'; 는 문자 'A'를 저장한다.
- 문자열(string): 여러 개의 문자가 연속해서 저장된 데이터 타입. 예를 들어 char s[] = "HELLO"; 는 문자 'H', 'E', 'L', 'L', 'O' 그리고 마지막에 \0 까지 포함된다.
문자 배열과 문자열 배열의 차이
C 언어에서 문자열을 저장할 때는 문자 배열을 사용해야 한다. 하지만 문자 배열과 문자열 배열은 서로 다르다.
1. 문자 배열 (Character Array)
단순한 문자들의 배열로, 하나의 문자열을 저장할 때 사용한다.
char name[] = {'E', 'M', 'M', 'A', '\0'};
- 위 코드는 문자 배열이며, 문자열 "EMMA"를 저장한다.
- \0(널 종단 문자)이 포함되어야 문자열로서 올바르게 동작한다.
- 하지만 이는 하나의 문자열만 저장할 수 있다.
2. 문자열 배열 (Array of Strings) = 포인터 배열
여러 개의 문자열을 저장하려면 문자 배열의 배열 또는 포인터 배열을 사용해야 한다.
char *names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};
- 위 코드는 문자열 배열이며, 사실 포인터 배열이다.
- names는 문자열들의 시작 주소를 저장하는 포인터 배열이다.
- 각 요소는 문자열을 가리키는 포인터(char *)로 저장된다.
- 즉, names[0]은 "EMMA"라는 문자열이 저장된 메모리 주소를 가리키고, names[1]은 "RODRIGO"의 주소를 가리킨다.
여러 개의 문자열을 배열로 저장하기
만약 여러 개의 이름을 저장해야 한다면, 다음과 같이 문자열 배열(포인터 배열) 을 사용할 수 있다.
char *names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};
printf("%s\n", names[0]);
printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]);
코드 분석
- names[0]은 "EMMA"라는 문자열을 가리킨다. 따라서 printf("%s\n", names[0]); 은 "EMMA"를 출력한다.
- printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]); 는 각각 E, M, M, A를 출력한다.
널 종단 문자(\0)가 필요한 이유
문자열이 단순한 문자 배열이라면, 어디까지가 문자열인지 어떻게 알 수 있을까?
C 언어에서는 배열에 크기를 자동으로 저장하지 않기 때문에 문자열의 끝을 표시하는 특별한 기호가 필요하다. 널 종단 문자(\0) 는 문자열의 끝을 나타내는 역할을 한다.
널 종단 문자가 없는 경우
#include <stdio.h>
int main() {
char name[] = {'E', 'M', 'M', 'A'}; // 널 종단 문자 없음
printf("%s\n", name); // 잘못된 동작 가능
return 0;
}
이 코드에서는 printf("%s\n", name); 가 name의 끝을 찾지 못하고, 메모리에 저장된 다른 값까지 출력할 수도 있다.
널 종단 문자가 있는 경우
#include <stdio.h>
int main() {
char name[] = {'E', 'M', 'M', 'A', '\0'}; // 올바른 문자열 저장
printf("%s\n", name); // 정상적으로 "EMMA" 출력
return 0;
}
널 종단 문자는 문자열의 끝을 명확히 알려주기 때문에 문자열을 처리하는 함수(printf, strlen, strcpy 등)가 제대로 동작할 수 있도록 해준다. 따라서 C 언어에서 문자열을 다룰 때, 항상 널 종단 문자가 포함되어 있는지 확인하는 것이 중요하다:)
+ 문자열 배열은 사실 포인터 배열 이라는 점도 기억하자. 즉, char *names[] 와 같이 선언하면 문자열을 저장하는 것이 아니라 문자열이 저장된 메모리의 주소를 저장하는 구조가 된다. 이러한 특성을 이해하면 포인터 개념을 더 쉽게 익힐 수 있으니까🥰.
'IT' 카테고리의 다른 글
C 언어에서 '\0'과 ""의 차이: 문자와 문자열의 핵심 차이 이해하기 (0) | 2025.03.21 |
---|---|
문자열 처리와 변환: 문자열 길이 구하기, 대소문자 변환하기 (0) | 2025.03.20 |
동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석 (0) | 2025.03.18 |
C 언어 디버깅 & 코드 품질 향상: check50, style50, 배열 활용 가이드 (0) | 2025.03.17 |
C 언어 디버깅 : 버그 해결 + 디버깅 도구 활용 (0) | 2025.03.17 |
댓글
이 글 공유하기
다른 글
-
C 언어에서 '\0'과 ""의 차이: 문자와 문자열의 핵심 차이 이해하기
C 언어에서 '\0'과 ""의 차이: 문자와 문자열의 핵심 차이 이해하기
2025.03.21 -
문자열 처리와 변환: 문자열 길이 구하기, 대소문자 변환하기
문자열 처리와 변환: 문자열 길이 구하기, 대소문자 변환하기
2025.03.20 -
동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석
동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석
2025.03.18 -
C 언어 디버깅 & 코드 품질 향상: check50, style50, 배열 활용 가이드
C 언어 디버깅 & 코드 품질 향상: check50, style50, 배열 활용 가이드
2025.03.17