下面是编译用"%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;
}
请帮我找错误。谢谢
答案 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会处理它。