Objective:
The goal of this exercise is to create a program that can perform string replacement within the contents of a file without using the C file manipulation functions or the std::string::replace
function. Specifically, the program should:
- Take three parameters: a filename and two strings (
s1
ands2
). - Open the specified file, read its contents, and create a new file with the same content where every occurrence of
s1
is replaced withs2
- Use only the allowed
std::string member
functions (exceptreplace
) to achieve this task. - Handle unexpected inputs and errors gracefully.
replace.cpp
:
void Replace::replace_string(std::string &str, const std::string &s1, const std::string &s2)
{
if (s1.empty())
return;
size_t start_pos = 0;
while ((start_pos = str.find(s1, start_pos)) != std::string::npos)
{
str.erase(start_pos, s1.length());
str.insert(start_pos, s2);
start_pos += s2.length();
}
}
Explanation of Each Step and Member Function:
-
Check for an empty
s1
string:if (s1.empty()) return;
- Purpose: Ensure
s1
is not empty. Replacing an empty string doesn't make sense because every position in the string could be considered a match. - Member Function:
std::string::empty()
returnstrue
if the string is empty (i.e., its length is 0).
- Purpose: Ensure
-
Initialize
start_pos
to 0:size_t start_pos = 0;
- Purpose:
start_pos
keeps track of the current position in the string where the search fors1
will start. - Type:
size_t
is an unsigned integral type used to represent sizes and indices.
- Purpose:
-
Search for the substring
s1
and replace it:while ((start_pos = str.find(s1, start_pos)) != std::string::npos) { str.erase(start_pos, s1.length()); str.insert(start_pos, s2); start_pos += s2.length(); }
- Loop Condition: The loop continues as long as
str.find(from, start_pos)
finds an occurrence ofs1
instr
. Iffind
returnsstd::string::npos
, it means no more occurrences are found. - Find Function:
std::string::find()
searches for the first occurrence of the substrings1
instr
starting from the positionstart_pos
. If found, it returns the position of the first character of the found substring; otherwise, it returnsstd::string::npos
. - Replace Operation:
str.erase(start_pos, s1.length())
: Removes the substrings1
fromstr
starting at positionstart_pos
.str.insert(start_pos, s2)
: Inserts the replacement strings2
intostr
at positionstart_pos
.start_pos += s2.length()
: Updatesstart_pos
to the position after the inserted replacement string to continue searching for the next occurrence.
- Loop Condition: The loop continues as long as
-
Example:
std::string str = "Hello world! Hello everyone!";
std::string from = "Hello";
std::string to = "Hi";
replaceString(str, from, to);
- Initial
str
:"Hello world! Hello everyone!"
. find(from, 0)
returns 0.erase(0, 5)
results in" world! Hello everyone!"
.insert(0, "Hi")
results in"Hi world! Hello everyone!"
.- Update
start_pos
to 2 (position after "Hi"). find(from, 2)
returns 11.erase(11, 5)
results in "Hi world! everyone!".insert(11, "Hi")
results in"Hi world! Hi everyone!"
.- Update
start_pos
to 13 (position after second "Hi"). find(from, 13)
returnsstd::string::npos
.- Loop ends.
Hi world! Hi everyone!