문자열(String)은 프로그래밍에서 가장 기본적이면서도 중요한 데이터 유형 중 하나입니다. 문자열은 본질적으로 문자형(char) 배열이며, GATE와 같은 경쟁 시험에서도 단골 출제 주제입니다. 이번 글에서는 C++ 문자열의 핵심 개념을 먼저 정리한 뒤, 실제 출력 결과를 예측하는 연습 문제를 통해 개념을 확실히 다져 보겠습니다.
C++에서 문자열을 저장하는 두 가지 방법
C++에서 문자열은 크게 두 가지 방식으로 저장할 수 있습니다.
- 문자 배열 사용: char str[size];
- 포인터 사용: char *ch = "Hello";
두 방식은 비슷해 보이지만 동작 방식에 중요한 차이가 있으며, 다음 사항을 반드시 기억해야 합니다.
- 문자열의 크기를 구할 때는 sizeof 연산자에 문자열 리터럴이 아닌 문자 배열 변수를 전달해야 합니다. 예: sizeof(str)
- 모든 문자열의 끝은 널(null) 문자 '\0'으로 표시되며, 이를 통해 문자열의 종료 지점을 판단합니다.
- 문자열의 길이를 구할 때는 표준 라이브러리 함수 strlen()을 사용합니다.
- 문자열의 내용을 수정하려면 반드시 char 배열을 사용해야 하며, 포인터가 가리키는 문자열 리터럴은 개별 문자를 직접 변경할 수 없습니다.
연습 문제: 출력 결과 예측하기
이제 앞서 배운 개념을 바탕으로 몇 가지 코드의 출력 결과를 예측해 보겠습니다.
예제 1: 포인터 증가
char name[] = "TutorialsPoint"; char *ptr = name; cout << ++ptr;
출력:
utorialsPoint
++ptr은 포인터 값을 1 증가시키므로 출력이 인덱스 1(두 번째 문자)부터 시작됩니다. 그 결과 첫 번째 문자 'T'가 생략된 문자열이 출력됩니다.
예제 2: 역순 출력
char name[] = "TutorialsPoint";
int length = strlen(name);
for(int i = length; i > 1; i--)
printf("%c", name[i]);
출력:
tniopslairot
루프가 문자열 길이부터 인덱스 1까지 역순으로 순회하며 문자를 하나씩 출력하기 때문에 문자열이 거꾸로 출력됩니다.
예제 3: 포인터 산술 연산
char c[] = "LearnProgrammingAtTutorialsPoint";
char *p = c;
printf("%s", p + c[1] - c[2] + 1);
출력:
ProgrammingAtTutorialsPoint
여기서 c[1]은 'e'(ASCII 101), c[2]는 'a'(ASCII 97)이므로 p + 101 - 97 + 1, 즉 p + 5가 됩니다. 따라서 인덱스 5부터 나머지 문자열 전체가 출력됩니다.
마무리
문자열과 포인터의 관계를 이해하는 것은 C++ 학습에서 매우 중요합니다. 특히 포인터 산술 연산과 널 문자('\0')의 역할을 정확히 이해하면 위와 같은 문제를 손쉽게 해결할 수 있습니다. 다양한 예제를 직접 작성하고 실행해 보면서 개념을 완전히 익혀 보시기 바랍니다.