Reputation: 6774
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
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
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
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
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
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