Given three strings 'str', 'oldW' and 'newW'. The task is find all occurrences of the word 'oldW' and replace then with word 'newW'. Examples:
Input : str[] = "xxforxx xx for xx",
oldW[] = "xx",
newW[] = "geeks"
Output : geeksforgeeks geeks for geeks
The idea is to traverse the original string and count the number of times old word occurs in the string. Now make a new string of sufficient size so that new word can be replaced. Now copy original string to new string with replacement of word.
Implementation:
// 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;
}
Output:
Old string: xxforxx xx for xx New String: GeeksforGeeks Geeks for Geeks
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 2: This method involves the in-place update of the string. It is more efficient as it uses only extra space for the new characters to be inserted.
Implementation:
// C Program to replace a word in a text by another given
// word by inplace updation
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void replaceWord(char* str, char* oldWord, char* newWord)
{
char *pos, temp[1000];
int index = 0;
int owlen;
owlen = strlen(oldWord);
// Repeat This loop until all occurrences are replaced.
while ((pos = strstr(str, oldWord)) != NULL) {
// Bakup current line
strcpy(temp, str);
// Index of current found word
index = pos - str;
// Terminate str after word found index
str[index] = '\0';
// Concatenate str with new word
strcat(str, newWord);
// Concatenate str with remaining words after
// oldword found index.
strcat(str, temp + index + owlen);
}
}
int main()
{
char str[1000], oldWord[100], newWord[100];
printf("Enter the string: ");
gets(str);
printf("Enter the word to be replaced: ");
gets(oldWord);
printf("Replace with: ");
gets(newWord);
replaceWord(str, oldWord, newWord);
printf("\nModified string: %s", str);
return 0;
}
Input:
1 xxforxx xx for xx xx geeks
Output:
geeksforgeeks geeks for geeks
Time Complexity: O(n)
Auxiliary Space: O(1)