Replace all spaces in a string with '% 20' (C ++)

advertisements

Having some trouble understanding parts of the code; the output I am getting is also wrong. The problem is to replace all spaces in a string with '%20'. The full code is shown below; it compiles but doesn't run exactly as it should.

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

void replaceSpaces(string str){

    //Getting the length of the string, counting the number of spaces
    int strLen = str.length();
    int i, count = 0;
    for (i = 0; i <= strLen; i++) {
        if(str[i]==' ')
        count++;
    }

    //Determining the new length needed to allocate for replacement characters '%20'
    int newLength = strLen + count * 2;

    str[newLength] = '\0';
    for (i = strLen - 1; i >= 0; i--) {
        if (str[i] == ' ') {
            str[newLength - 1] = '0';
            str[newLength - 2] = '2';
            str[newLength - 3] = '%';
            newLength = newLength - 3;
        }

        else {
            str[newLength - 1] = str[i];
            newLength = newLength -1;
        }
    }
    cout << str <<endl;

}

int main() {

    string str = "hello jellybean hello";
    replaceSpaces(str);

    return 0;

}


I am probably missing something obvious, but when allocating for the new string length in this line:

int newLength = strLen + count * 2;

Here we are multiplying the number of spaces by 2, but if we are trying to replace all spaces with '%20', why not multiply it by 3?


str[newLength] = '\0';

Does this line indicate that the position past the last character in the string is assigned a null space?


Am also confused about the else statement.

 else {
        str[newLength - 1] = str[i];
        newLength = newLength -1;
    }

Not sure if I completely understand the circumstance when this would be executed.


When the functions are compiled and run, if

string str = "hello jellybean hello";

the expected output would be hello%20jellybean%20hello, except the output I am getting is hello%20jellybean%20h.

In terms of time complexity, since there are two independent for loops, would the time complexity be O(n)?

I know I'm asking a lot of different questions, many thanks in advance for any answers!


This is wrong:

str[newLength] = '\0';

std::string objects maintain their NUL terminator internally based on their size. You want

str.resize(newLength);

instead.