-
Notifications
You must be signed in to change notification settings - Fork 0
/
FindReplaceString.c
120 lines (95 loc) · 4.12 KB
/
FindReplaceString.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
A program to replace a string/word with another in a line of text/input.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Usage Example:
// replaceWord("Hello World", "World", "Earth");
char* replaceWord(const char* stringInput,
const char* searchWord,
const char* replaceWord)
{
// Program constants
const char terminationCharacter = '\0';
// + 1 is for the \0 character in the string array
const int terminationCharacterLength = 1;
// Chapter 1 [Allocating Memory]
// Counting the characters in the variables
int searchWordLength = strlen(searchWord);
int replaceWordLength = strlen(replaceWord);
// Counting Occurences in the stringInput
int i;
int occurences;
printf("xx is replace word, so it is jumped over\n ---\n"); // Look for comment: "Jumping to index after the old word."
for (i = 0, occurences=0; stringInput[i] != terminationCharacter; i++) {
// If the stringInput Token matches Search word:
printf("%s | stringInput[%i]\n", &stringInput[i], i);
// Scans for occurence of searchWord in the current InputString[i],
// strstr Returns a pointer to the first occurrence
// We compare the returned pointer address with ...? the remainding string character's Address?
// If the result of the returned found pointer is the same as
// strstr simply returns whole inputString if the search word matched. It is refered as "pointer of first occurence". Else Null.
// That way, this event of first occurence can be used.
if (strstr(&stringInput[i], searchWord) == &stringInput[i]) {
//printf("strstr: %p\n", strstr(&stringInput[i], searchWord));
printf("|>");
printf(&stringInput[i]);
printf("<|\n");
occurences++;
// Jumping to index after the matched searchWord.
i += searchWordLength - 1;
}
else {
printf("|->");
printf(&stringInput[i]);
printf("<-|\n");
}
}
// Chapter 2 [Allocating Memory]
// Allocating memory for the result variable
// Making new string of enough length
// i - The overall counted tokens in the stringInput
// occurences - The counted occurences stringInput
// (replaceWordLength - searchWordLength)
printf("replaceWordLength - %i, searchWordLenght - %i\n", replaceWordLength, searchWordLength);
printf("i - %i, occurences - %i\n", i, occurences);
// Look further: C Operator Precedence (c language arithmetic operators evaluation order)
char* result;
result = (char*)malloc(
i + occurences * (replaceWordLength - searchWordLength) + terminationCharacterLength
);
// occurences * (replaceWordLength - searchWordLength) + 17
printf("result: %i\n", result);
// Chapter 3 [Replacing Words]
// Loop stringInput and replace words
i = 0;
while (*stringInput) {
// Compare the substring with the result
if (strstr(stringInput, searchWord) == stringInput) {
// Copy string to the result array
strcpy(&result[i], replaceWord);
// Add length of replacement word to the Loop increment
i += replaceWordLength;
// After adding a string, increase an array length
// Add searchWordLenght to the String Input???
stringInput += searchWordLength;
}
else
// If stringInput does not match searchable word
// Set result item to the stringInput item
result[i++] = *stringInput++;
}
// Add terminationCharacter at the end of result array
result[i] = terminationCharacter;
return result;
}
// Driver Program
int main()
{
char* result = NULL;
result = replaceWord("xxforxx xx for xx", "xx", "Geeks");
printf("New String: %s\n", result);
free(result);
return 0;
}