How to replace all occurrences of a character in string?

后端 未结 15 1254
别那么骄傲
别那么骄傲 2020-11-22 05:54

What is the effective way to replace all occurrences of a character with another character in std::string?

15条回答
  •  [愿得一人]
    2020-11-22 06:13

    If you're willing to use std::strings, you can use this sample-app's strsub function as-is, or update it if you want it to take a different type or set of parameters to achieve roughly the same goal. Basically, it uses the properties and functionalities of std::string to quickly erase the matching set of characters, and insert the desired characters directly within the std::string. Every time it does this replacement operation, the offset updates if it can still find matching chars to replace, and if it can't due to nothing more to replace, it returns the string in its state from the last update.

    #include 
    #include 
    
    std::string strsub(std::string stringToModify,
                       std::string charsToReplace,
                       std::string replacementChars);
    
    int main()
    {
        std::string silly_typos = "annoiiyyyng syyyllii tiipos.";
    
        std::cout << "Look at these " << silly_typos << std::endl;
        silly_typos = strsub(silly_typos, "yyy", "i");
        std::cout << "After a little elbow-grease, a few less " << silly_typos << std::endl;
        silly_typos = strsub(silly_typos, "ii", "y");
    
        std::cout << "There, no more " << silly_typos << std::endl;
        return 0;
    }
    
    std::string strsub(std::string stringToModify,
                       std::string charsToReplace,
                       std::string replacementChars)
    {
        std::string this_string = stringToModify;
    
        std::size_t this_occurrence = this_string.find(charsToReplace);
        while (this_occurrence != std::string::npos)
        {
            this_string.erase(this_occurrence, charsToReplace.size());
            this_string.insert(this_occurrence, replacementChars);
            this_occurrence = this_string.find(charsToReplace,
                                               this_occurrence + replacementChars.size());
        }
    
        return this_string;
    }
    

    If you don't want to rely on using std::strings as your parameters so you can pass in C-style strings instead, you can see the updated sample below:

    #include 
    #include 
    
    std::string strsub(const char * stringToModify,
                       const char * charsToReplace,
                       const char * replacementChars,
                       uint64_t sizeOfCharsToReplace,
                       uint64_t sizeOfReplacementChars);
    
    int main()
    {
        std::string silly_typos = "annoiiyyyng syyyllii tiipos.";
    
        std::cout << "Look at these " << silly_typos << std::endl;
        silly_typos = strsub(silly_typos.c_str(), "yyy", "i", 3, 1);
        std::cout << "After a little elbow-grease, a few less " << silly_typos << std::endl;
        silly_typos = strsub(silly_typos.c_str(), "ii", "y", 2, 1);
    
        std::cout << "There, no more " << silly_typos << std::endl;
        return 0;
    }
    
    std::string strsub(const char * stringToModify,
                       const char * charsToReplace,
                       const char * replacementChars,
                       uint64_t sizeOfCharsToReplace,
                       uint64_t sizeOfReplacementChars)
    {
        std::string this_string = stringToModify;
    
        std::size_t this_occurrence = this_string.find(charsToReplace);
        while (this_occurrence != std::string::npos)
        {
            this_string.erase(this_occurrence, sizeOfCharsToReplace);
            this_string.insert(this_occurrence, replacementChars);
            this_occurrence = this_string.find(charsToReplace,
                this_occurrence + sizeOfReplacementChars);
        }
    
        return this_string;
    }
    

提交回复
热议问题