이 프로그램에서는 세 개의 문자열 text, oldWord, newWord가 주어집니다. 우리의 목표는 텍스트 안에 포함된 특정 단어(oldWord)를 찾아 새로운 단어(newWord)로 모두 교체하는 C 프로그램을 작성하는 것입니다.
프로그램은 텍스트 전체를 탐색하면서 oldWord가 등장하는 모든 위치를 찾아내고, 해당 부분을 newWord로 대체한 결과 문자열을 생성합니다.
문제 이해를 위한 예시
입력
text = "I am learning programming" oldWord = "learning" newWord = "practicing"
출력
"I am practicing programming"
해결 접근 방법
이 문제를 해결하기 위해서는 다음과 같은 순서로 진행합니다.
1. 먼저 원본 문자열(text) 안에 oldWord가 몇 번 등장하는지 개수를 계산합니다.
2. 등장 횟수와 단어 길이 차이를 바탕으로 결과를 저장할 새 문자열의 크기를 계산하고 메모리를 동적으로 할당합니다.
3. 원본 문자열을 처음부터 끝까지 탐색하면서 oldWord를 발견하면 newWord로 교체하여 새 문자열에 복사하고, 그렇지 않으면 기존 문자를 그대로 복사합니다.
여기서 핵심 함수는 strstr()입니다. 이 함수는 현재 위치에서 oldWord가 시작되는지 확인하는 데 사용되며, 일치하는 경우 포인터가 해당 위치를 가리키게 됩니다.
C 언어 구현 코드
// 텍스트 속 단어를 다른 단어로 교체하는 C 프로그램
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void replaceWordInText(const char *text, const char *oldWord, const char *newWord) {
int i = 0, cnt = 0;
int len1 = strlen(newWord);
int len2 = strlen(oldWord);
// oldWord가 등장하는 횟수 계산
for (i = 0; text[i] != '\0'; i++) {
if (strstr(&text[i], oldWord) == &text[i]) {
cnt++;
i += len2 - 1;
}
}
// 교체 후 길이에 맞춰 새 문자열 메모리 할당
char *newString = (char *)malloc(i + cnt * (len1 - len2) + 1);
i = 0;
while (*text) {
if (strstr(text, oldWord) == text) {
// oldWord 발견 시 newWord로 교체
strcpy(&newString[i], newWord);
i += len1;
text += len2;
}
else
newString[i++] = *text++;
}
printf("New String: %s\n", newString);
}
int main() {
char str[] = "I am learning programming";
char c[] = "learning";
char d[] = "practicing";
char *result = NULL;
printf("Original string: %s\n", str);
replaceWordInText(str, c, d);
return 0;
}실행 결과
Original string: I am learning programming New String: I am practicing programming
코드 설명
위 코드의 동작 과정을 살펴보면 다음과 같습니다.
1단계 – 등장 횟수 계산: 첫 번째 for 루프에서 strstr(&text[i], oldWord) == &text[i] 조건을 통해 현재 위치 i에서 oldWord가 시작되는지 검사합니다. 일치하면 카운트(cnt)를 증가시키고, 중복 검사를 피하기 위해 인덱스를 oldWord 길이만큼 건너뜁니다.
2단계 – 메모리 할당: 교체 후 문자열 길이는 원본 길이에 (newWord 길이 − oldWord 길이) × 등장 횟수를 더한 값이 됩니다. 이 크기만큼 malloc()으로 메모리를 할당합니다.
3단계 – 실제 교체: while 루프에서 oldWord가 발견되면 strcpy()로 newWord를 복사한 뒤 두 포인터를 각각의 단어 길이만큼 앞으로 이동시킵니다. 일치하지 않으면 현재 문자를 그대로 복사하고 다음 문자로 넘어갑니다.
이 알고리즘의 시간 복잡도는 O(n × m)입니다. 여기서 n은 텍스트의 길이, m은 oldWord의 길이입니다. 문자열 처리와 동적 메모리 할당을 함께 연습할 수 있는 좋은 예제이므로, 직접 코드를 변형해 보면서 다양한 입력에 대해 테스트해 보시기 바랍니다.