实现去掉字符串中空格的功能。
其间发现值得注意的几点:
!!以下为错误代码!!
class test4
{
public:
int main4()
{
const char *inbuf = " a string with space ! ";
char *outbuf = new char[50];
if (inbuf == nullptr || outbuf == nullptr)
return -1;
while (*inbuf != '\0')
{
if (*inbuf != ' ')
*outbuf++ = *inbuf;
inbuf++;
}
*outbuf = '\0';
cout << outbuf << endl;
delete[] outbuf;
outbuf = nullptr;
cout << "end" << endl;
return 0;
}
};
!!以上为错误代码!!
在处理过程中,移动了inbuf和outbuf指针指向位置,所以cout并不能输出正确结果。
更关键的是,虽然有char *outbuf = new char[50];
,但是在移动了outbuf指向位置后,delete[] outbuf;
并不是释放所预期的位置的内存,delete其他未知区域是显然是很危险的。
一种解决方案,设置临时量保存初试位置,然后操作指针,或者临时变量的指针,这里简单叙述下,就把两种方法结合了,实际用任何一种都行:
class test5
{
public:
int main5()
{
const char *inbuf = " a string with space ! ";
char *outbuf = new char[50];
char *out = outbuf; //解1: 保存现场,处理后再还原
const char *tempinbuf = inbuf; //解2: 操作临时指针,不改变原指针
if (tempinbuf == nullptr || outbuf == nullptr)
return -1;
while (*tempinbuf != '\0')
{
if (*tempinbuf != ' ')
*outbuf++ = *tempinbuf;
tempinbuf++;
}
*outbuf = '\0';
outbuf = out; //还原
cout << outbuf << endl;
delete[] outbuf;
outbuf = nullptr;
cout << "end" << endl;
return 0;
}
};
另,因为函数是按值传递,所以用函数实现是没有问题的:
class test1
{
public:
int trimSpace(const char *inbuf, char *outbuf)
{
if (inbuf == nullptr || outbuf == nullptr)
return -1;
while (*inbuf != '\0')
{
if (*inbuf != ' ')
*outbuf++ = *inbuf;
inbuf++;
}
*outbuf = '\0';
return 0;
}
void main1()
{
const char *inbuf = " a string with space ! ";
char *outbuf = new char[100];
if(trimSpace(inbuf, outbuf) != 0)
return;
cout << outbuf << endl;
delete[] outbuf;
outbuf = nullptr;
cout << "end" << endl;
}
};