Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

텍스트 속 단어를 다른 단어로 교체하는 C 프로그램 작성 방법

이 프로그램에서는 세 개의 문자열 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의 길이입니다. 문자열 처리와 동적 메모리 할당을 함께 연습할 수 있는 좋은 예제이므로, 직접 코드를 변형해 보면서 다양한 입력에 대해 테스트해 보시기 바랍니다.