1

下面是我为用“%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;
}

请帮我找出错误。谢谢

4

3 回答 3

5

spaces在您增加它之前未初始化。

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

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

spaces正确初始化后,您的程序将编译并运行良好。

于 2012-07-08T03:08:12.833 回答
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;
}
于 2012-07-08T03:13:28.250 回答
0

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

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

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

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

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

于 2012-07-08T03:09:56.390 回答