So this is my solution to the Codecademy Learn C++ Project – Bleep. This was my first ever full C++ creation, and I am well aware there is a (far) more efficient solution! Nevertheless, I’m rather proud that after (quite a lot of) debugging, I created working code for this project from scratch. The premise of the project is that given a sample of text, and a target word, all instances of the word within the text should be replaced with * characters.
I went overboard with the comments so that I would have a reference as to what was going through my brain as I created each section.
The bleep int main() looks like this:
#include <iostream>
#include <string>
#include "functions.hpp"
int main() {
std::string word = "broccoli";
std::string text = "Tonight's meal, broccoli bake, consists mostly of broccoli florets basted in a rich broccoli sauce.";
//call our bleep function
bleep(word, text);
//display our censored text
std::cout << text + "\n";
}
The functions.hpp header file, where I declared my utility functions:
#include <iostream>
#include <string>
//declares basic functions of bleep
void bleep(std::string word, std::string &text);
bool check(std::string const &string1, std::string const &string2);
And finally the guts of my program in functions.cpp:
#include <iostream>
#include <string>
#include "functions.hpp"
//print comments included for debugging
void bleep(std::string word, std::string &text){
//temporary storage string as we work through text
std::string temp;
//punc defines some basic punctuation
std::string punc = " ,.!?";
//start and end will be pointers to indexes of text
int start = 0;
int end = 0;
//puncflag toggles when punctuation is detected to format temp
bool puncflag = false;
//outer for loop iterates over each character of text, adding it to temp
for (int i = 0; i < text.size(); i++){
//inner for loop iterates over the punctuation
for (int k = 0; k < punc.size(); k++){
//if punctuation detected, there is a word break. Need to check preceding word.
if (text[i] == punc[k]) {
// std::cout << "Punctuation detected!\n";
// std::cout << temp << "\n";
// boolean function call to check if temp is the target word
if (check(temp, word)){
// std::cout << "Word detected!\n";
// logic to replace characters in text using start and end index pointers
end = i - 1;
// std::cout << start << "\n";
// std::cout << end << "\n";
for (int j = start; j <= end; j++){
text[j] = '*';
}
}
// flush temp, set new start pointer, and flag a punctuation detection
temp = "";
start = i + 1;
puncflag = true;
continue;
// check for edge case where target word is at end of text and unpunctuated
} else if (i == (text.size() - 1)) {
// std::cout << "End of text detected!\n";
if (check(temp,word)){
// logic similar to above, only end pointer is different
end = i;
for (int j = start; j > end; j++){
text[j] = '*';
}
continue;
}
}
}
// if current character is word break punctuation, don't want it added to temp
if (puncflag){
puncflag = false;
continue;
} else {
// if it is just a normal character, add to temp
temp += text[i];
}
}
}
//simple logic to check each word parsed against target word
bool check(std::string const &string1, std::string const &string2){
if (string1 == string2){
return true;
}
return false;
}