이 튜토리얼에서는 문자열의 마지막 10줄을 출력하는 프로그램을 C++로 구현하는 방법을 살펴봅니다.
여기서 입력으로 주어지는 문자열은 줄바꿈 문자('\n')를 포함하고 있으며, 각 줄바꿈 문자가 새로운 줄의 시작을 의미합니다. 우리의 목표는 문자열의 끝에서부터 거꾸로 세어 마지막 10줄 전체를 출력하는 것입니다.
알고리즘 접근 방식
핵심 아이디어는 다음과 같습니다.
1. strrchr() 함수를 사용해 문자열에서 마지막 줄바꿈 문자의 위치를 찾습니다.
2. 해당 위치에서 문자열의 앞쪽 방향으로 포인터를 이동시키며, 줄바꿈 문자를 만날 때마다 줄 수를 하나씩 카운트합니다.
3. 원하는 줄 수(n)만큼 카운트되거나 문자열의 시작에 도달하면 반복을 멈춥니다.
4. 최종적으로 도달한 위치부터 문자열 끝까지 출력하면 마지막 n줄이 화면에 나타납니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
#define DELIM '\n'
//마지막 10줄을 출력하는 함수
void print_last_lines(char *str, int n){
if (n <= 0)
return;
size_t cnt = 0; //카운트한 줄 수 저장
char *target_pos = NULL;
//마지막 줄의 시작 위치 탐색
target_pos = strrchr(str, DELIM);
if (target_pos == NULL){
cout << "주어진 문자열은 한 줄짜리 문자열입니다";
return;
}
//원하는 줄의 시작 위치까지 거꾸로 이동
while (cnt < n){
//이전 줄로 이동
while (str < target_pos && *target_pos != DELIM)
--target_pos;
if (*target_pos == DELIM)
--target_pos, ++cnt;
//문자열이 10줄보다 짧으면 반복 종료
else
break;
}
if (str < target_pos)
target_pos += 2;
cout << target_pos << endl;
}
int main(void){
char *str1 ="str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9" "\nstr10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17" "\nstr18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25";
print_last_lines(str1, 10);
return 0;
}실행 결과
str16 str17 str18 str19 str20 str21 str22 str23 str24 str25
코드 설명
위 예제에서는 총 25개의 줄로 구성된 문자열을 입력으로 사용했습니다. 함수 print_last_lines()는 먼저 strrchr()로 문자열 내 마지막 줄바꿈 문자를 찾습니다. 만약 줄바꿈 문자가 하나도 없다면, 해당 문자열은 한 줄짜리 문자열이므로 별도 처리 없이 메시지를 출력하고 종료합니다.
이후 내부 while 루프가 포인터를 뒤쪽에서 앞쪽으로 이동시키며 줄바꿈 문자를 만날 때마다 카운트를 증가시킵니다. 카운트가 10에 도달하면 루프가 종료되고, 그 시점의 포인터 위치부터 문자열 끝까지 출력하여 정확히 마지막 10줄(str16 ~ str25)이 화면에 표시됩니다.
이 방식은 문자열을 한 번만 역방향으로 순회하므로 효율적이며, 파일 로그의 마지막 몇 줄을 확인하는 tail 명령과 유사한 동작을 구현할 때 유용하게 활용할 수 있습니다.