以下程序用%20替换所有空格。编译工作正常,但程序在运行时终止。任何帮助???
#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);
}
答案 0 :(得分:5)
这称为“off by one”错误。
while(i<=len){
if(url[i]==' ')
我还会考虑std::string::find()
和std::string::replace()
,而不是你正在做的事情。
编辑:由于海报说这不是作业:
for (size_t pos = myString.find(' ');
pos != string::npos;
pos = myString.find(' ', pos))
{
myString.replace(pos, 1, "%20");
}
答案 1 :(得分:3)
我没有初始化为0 - 如果使用','而不是将每个变量放在自己的行上,这就是危险。
答案 2 :(得分:2)
string newarr[length2];
应该是:
string newarr;
或
char newarr[length2];
或更恰当的方式:
char *newarr = new char[length2];
... // code.
delete[] newarr;
答案 3 :(得分:2)
只要您使用string
而非char *
,为什么不使用string
方法?这实际上是您尝试做的事情的翻译(甚至没有使用::find
或::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;
}
修改:我看到@Bryan已为::find
和::replace
提供了该版本。
答案 4 :(得分:1)
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);
}
使用它:
string replace = replaceinString(thisstring, " ", "%20");
string replace2 = replaceinString(thisstring, " ", "-");
string replace3 = replaceinString(thisstring, " ", "+");