Prog错误:用“%20”替换空格

时间:2012-07-08 03:02:51

标签: c++

下面是编译用"%20"替换空格的编程。但是当我运行它时,输出窗口显示空白并显示消息" arrays5.exe已发生问题"

#include <iostream>
#include<cstring>

using namespace std;

void method(char str[], int len)               //replaces spaces with "%20"
{

    int spaces, newlen,i;

    for (i=0;i<len;i++)
        if(str[i]==' ') spaces++;
    newlen=len+spaces*2;
    str[newlen]=0;
    for (i=len-1;i>=0;i--)
    {
        if(str[i]==' ')
        {
            str[newlen-1]='0';
            str[newlen-2]='2';
            str[newlen-3]='%';
            newlen=newlen-3;
        }
        else
        {
            str[newlen-1]=str[i];
            newlen=newlen-1;
        }
    }
}
int main()
{
    char str[20]="sa h ";
    method(str,5);
    cout <<str<<endl;
    return 0;
}

请帮我找错误。谢谢

3 个答案:

答案 0 :(得分:5)

在递增之前,

spaces未初始化。

你应该给它一个初始的默认值。

未初始化的变量将具有规范未定义的值。这个值可能是0,如果你很幸运,但很可能这个值将是数据类型可能代表的值范围内的任何值。

spaces正确初始化时,您的程序将编译并运行正常。

答案 1 :(得分:2)

我不是在解决您的问题,而是提供更好的解决方案。如果你正在使用C ++,那么你应该使用STL。你有很多课程和方法可以完成所有的工作。

您可以将25行长的方法重写为这个4行长的方法(包括示例):

#include <iostream>
#include <string>

using namespace std;

std::string method(std::string str)
{
    size_t index;
    while((index = str.find(' ')) != std::string::npos)
        str = str.replace(index, 1, "%20");
    return str;
}
int main()
{
    std::string str("sa h ");
    str = method(str);
    cout <<str<<endl; // outputs sa%20h%20
    return 0;
}

答案 2 :(得分:0)

我建议你使用std :: string,并使用.replace方法。您的代码不起作用的原因是因为您以奇怪的方式覆盖输入字符串,所以我不知道您的预期输出是否正确,但是,您遇到的实际错误是您可能会在索引位置-3,-2和-1处重写。考虑第一个空间位于零指数的情况。

在C ++中,除非你有明确的理由,否则通常最好避免使用char *。作为一个好的风格(这有点主观),我建议你不要直接修改你的输入参数,而是返回结果。

即,你的方法原型应该是:

std::string method(std::string str)

不再需要传递字符串的长度,因为std :: string会处理它。