Home > Net >  How to replace "pi" by "3.14"?
How to replace "pi" by "3.14"?

Time:11-17

How to replace all "pi" from a string by "3.14"? Example: INPUT = "xpix" ___ OUTPUT = "x3.14x" for a string, not character array.

This doesn't work:

#include<iostream>
using namespace std;

void replacePi(string str)
{
    if(str.size() <=1)
    return ;

    replacePi(str.substr(1));
    int l = str.length();
    if(str[0]=='p' && str[1]=='i')
    {
        for(int i=l;i>1;i--)
        str[i 2] = str[i];
        str[0] = '3';
        str[1] = '.';
        str[2] = '1';
        str[3] = '4';
    }
}

int main()
{
    string s;
    cin>>s;
    replacePi(s);
    cout << s << endl;
}

CodePudding user response:

What you need is string::find and string::replace. Here is an example

size_t replace_all(std::string& str, std::string from, std::string to)
{
    size_t count = 0;
    std::string::size_type pos;
    while((pos=str.find(from)) != str.npos)
    {
        str.replace(pos, from.length(), to);
        count  ;
    }
    return count;
}

void replacePi(std::string& str)
{
    replace_all(str, "pi", "3.14");
}

CodePudding user response:

There is a ready to use function in the C lib. It is called: std::regex_replace. You can read the documentation in the CPP Reference here.

Since it uses regexes it is very powerful. The disadvantage is that it may be a little bit too slow during runtime for some uses case. But for your example, this does not matter.

So, a common C solution would be:

#include <iostream>
#include <string>
#include <regex>

int main() {

    // The test string
    std::string input{ "Pi is a magical number. Pi is used in many places. Go for Pi" };

    // Use simply the replace function
    std::string output = std::regex_replace(input, std::regex("Pi"), "3.14");

    // Show the output
    std::cout << output << "\n";
}

But my guess is that you are learning C and the teacher gave you a task and expects a solution without using elements from the std C library. So, a hands on solution.

This can be implemented best with a temporary string. You check character by character from the original string. If the characters do not belong to Pi, then copy them as is to new new string. Else, copy 3.14 to the new string.

At the end, overwrite the original string with the temp string.

Example:

#include <iostream>
#include <string>
using namespace std;

void replacePi(string& str) {

    // Our temporay
    string temp = "";
    
    // Sanity check
    if (str.length() > 1) {

        // Iterate over all chararcters in the source string
        for (size_t i = 0; i < str.length() - 1;   i) {

            // Check for Pi in source string
            if (str[i] == 'P' and str[i   1] == 'i') {

                // Add replacement string to temp
                temp  = "3.14";
                // We consumed two characters, P and i, so increase index one more time
                  i;
            }
            else {
                // Take over normal character
                temp  = str[i];
            }
        }
        str = temp;
    }
}
// Test code
int main() {

    // The test string
    std::string str{ "Pi is a magical number. Pi is used in many places. Go for Pi" };
    // Do the replacement
    replacePi(str);
    // Show result
    std::cout << str << '\n';
}
  • Related