Programa en C para reemplazar una palabra en un texto por otra palabra dada

Dadas tres strings ‘str’, ‘oldW’ y ‘newW’. La tarea es encontrar todas las apariciones de la palabra ‘oldW’ y reemplazarlas con la palabra ‘newW’. Ejemplos:

Input : str[] = "xxforxx xx for xx", 
        oldW[] = "xx", 
        newW[] = "geeks"
Output : geeksforgeeks geeks for geeks

La idea es recorrer la string original y contar el número de veces que aparece una palabra antigua en la string. Ahora haga una nueva string de tamaño suficiente para que la nueva palabra pueda ser reemplazada. Ahora copie la string original a la nueva string con el reemplazo de la palabra. 

Implementación:

C

// C program to search and replace
// all occurrences of a word with
// other word.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
// Function to replace a string with another
// string
char* replaceWord(const char* s, const char* oldW,
                const char* newW)
{
    char* result;
    int i, cnt = 0;
    int newWlen = strlen(newW);
    int oldWlen = strlen(oldW);
 
    // Counting the number of times old word
    // occur in the string
    for (i = 0; s[i] != '\0'; i++) {
        if (strstr(&s[i], oldW) == &s[i]) {
            cnt++;
 
            // Jumping to index after the old word.
            i += oldWlen - 1;
        }
    }
 
    // Making new string of enough length
    result = (char*)malloc(i + cnt * (newWlen - oldWlen) + 1);
 
    i = 0;
    while (*s) {
        // compare the substring with the result
        if (strstr(s, oldW) == s) {
            strcpy(&result[i], newW);
            i += newWlen;
            s += oldWlen;
        }
        else
            result[i++] = *s++;
    }
 
    result[i] = '\0';
    return result;
}
 
// Driver Program
int main()
{
    char str[] = "xxforxx xx for xx";
    char c[] = "xx";
    char d[] = "Geeks";
 
    char* result = NULL;
 
    // oldW string
    printf("Old string: %s\n", str);
 
    result = replaceWord(str, c, d);
    printf("New String: %s\n", result);
 
    free(result);
    return 0;
}
Producción:

Old string: xxforxx xx for xx
New String: GeeksforGeeks Geeks for Geeks

Complejidad temporal : O(n)
Espacio auxiliar: O(n)

Método 2: este método implica la actualización in situ de la string. Es más eficiente ya que utiliza solo espacio adicional para que se inserten los nuevos caracteres. 

Implementación:

CPP

#include <bits/stdc++.h>
using namespace std;
int main()
{
    // code
    int t;
    cin >> t;
    cin.ignore();
 
    while (t--) {
        string s;
        getline(cin, s);
 
        string x, y;
        getline(cin, x);
        getline(cin, y);
 
        reverse(s.begin(), s.end());
        reverse(x.begin(), x.end());
        reverse(y.begin(), y.end());
 
        int ls = s.length(), lx = x.length(), ly = y.length();
        int d = ly - lx;
        int ct = 0;
        int i = 0, j = 0;
 
        while (i < ls) {
            string temp = "";
            for (int k = 0; k < lx; k++) {
                temp += s[i + k];
            }
 
            if (temp == x) {
                ct++;
                i = i + lx;
            }
            else {
                i = i + 1;
            }
        }
 
        for (int i = 0; i < ct * d; i++)
            s += ' ';
 
        i = ls - 1;
        j = ls + ct * d - 1;
 
        while (i >= 0 && j >= 0) {
            string temp = "";
            for (int k = 0; k < lx; k++) {
                if (i < (lx - 1 - k))
                    break;
 
                temp += s[i - (lx - 1 - k)];
            }
 
            if (temp == x) {
                int k = ly - 1;
                while (k >= 0)
                    s[j--] = y[k--];
 
                i = i - lx;
            }
            else {
                s[j--] = s[i--];
            }
        }
        reverse(s.begin(), s.end());
        cout << s << endl;
    }
    return 0;
}
Aporte:

1
xxforxx xx for xx
xx
geeks
Producción:

geeksforgeeks geeks for geeks

Complejidad temporal: O(n)
Espacio auxiliar: O(1)

 Este artículo es una contribución de Anuj Chauhan . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *