Jony
Jony

Reputation: 6774

replacing space with %20

The following program replaces all spaces with %20.the compilation works fine but the program terminates during the runtime.Any help???

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

void removeSpaces(string url){

int len=url.length();
int i,count=0;
while(i<=len){
if(url[i]==' ')
count++;
i++;
}
int length2=len+(count*2);
string newarr[length2];
for(int j=len-1;j>=0;j--){
if(url[j]==' ')
{
  newarr[length2-1]='0';
  newarr[length2-2]='2';
  newarr[length2-3]='%';
  length2=length2-3;
}
else
{
  newarr[length2-1]=url[j];
  length2=length2-1;
}
}
cout<<"\nThe number of spaces in the url is:"<<count;
cout<<"\nThe replaced url is:"<<newarr;

}

int main(){

string url="http://www.ya h o o.com/";
removeSpaces(url);
}

Upvotes: 2

Views: 5874

Answers (5)

SudoBash
SudoBash

Reputation: 91

string replaceinString(std::string str, std::string tofind, std::string toreplace)
{
        size_t position = 0;
        for ( position = str.find(tofind); position != std::string::npos; position = str.find(tofind,position) )
        {
                str.replace(position ,1, toreplace);
        }
        return(str);
}

use it:

string replace = replaceinString(thisstring, " ", "%20");
string replace2 = replaceinString(thisstring, " ", "-");
string replace3 = replaceinString(thisstring, " ", "+");

Upvotes: 1

Brian Roach
Brian Roach

Reputation: 76898

This is called an "off by one" error.

while(i<=len){
    if(url[i]==' ')

I'd also look at std::string::find() and std::string::replace() rather than what you're doing.

EDIT: Since the poster has said this isn't homework:

for (size_t pos = myString.find(' '); 
     pos != string::npos; 
     pos = myString.find(' ', pos))
{
    myString.replace(pos, 1, "%20");
}

Upvotes: 6

egrunin
egrunin

Reputation: 25053

As long as you're using string and not char *, why not use the string methods? This is essentially a translation of what you're trying to do (without even using ::find or ::replace):

void removeSpaces(string url)
{
    string newUrl;
    int count = 0;

    for (int j = 0; j < url.length(); ++j)
    {
        if (url.at(j) == ' ')
        {
            newUrl.append("%20");
            ++count;
        }
        else
            newUrl.append(url.at(j));
    }

    cout << "\nThe number of spaces in the url is:" << count;
    cout << "\nThe replaced url is:"<< newUrl;
}

Edit: I see that @Bryan has given the version with ::find and ::replace.

Upvotes: 3

zmbush
zmbush

Reputation: 2810

string newarr[length2];

should be:

string newarr;

or

char newarr[length2];

or the more proper way:

char *newarr = new char[length2];
... // code.
delete[] newarr;

Upvotes: 2

Michael Dorgan
Michael Dorgan

Reputation: 12515

i is not initialized to 0 - this is the danger if using ',' instead of putting each variable on its own line.

Upvotes: 3

Related Questions