看看这个小程序有问题没?删除字符串里指定字符
#include <string.h>
#include <stdio.h>
char *fun(char*s,char c)
{
int i;
char *p=s;
char *ppPtr=p;
for (; *s!= '\0 '; s++)
{
if(*s!=c)
*p++=*s;
}
*p= '\0 ';
return ppPtr;
}
int main()
{
char szTemp[20]= "Hello,world ";
char *pStr;
pStr=szTemp;
printf( "Init str=%s\n ",pStr);
pStr= fun(szTemp, 'H ');
printf( "str = %s\n ",pStr);
return 0;
}
昨晚去面试,要写一个删除字符串里的指定字符,没做对。。
后来再网上找到这个,在VC6.0里面编译运行成功。。。
但是有点疑问:
在函数 fun中
定义指针:char *ppPtr=p;
在函数末尾居然用retur返回了这个指针?
个人觉得这个指针变量分配内存在践区,在函数运行完的时候内存应该被销毁了,这里用return 返回指针应该有问题吧?
请大家讨论和指点下!
[解决办法]
木有问题。
返回指针这件事不会产生问题。产生问题的代码是返回指向临时数据(如函数内定义的auto变量、数组)的指针。不要混淆了。
[解决办法]
没问题;
关键是你所有的指针都是指向 "Hello,world "这个字符串变量.
当return ppPtr时,实际上是返回的 "Hello,world "的地址,ppPtr这个变量值在pStr= fun(szTemp, 'H '); 这一句结束前都是有效的.
[解决办法]
我以前在面试的时候写过一个函数,跟这个差不多的。
我就是直接将后面的字符前移,最麻烦的就是往前移多少。这样不需要在另外开辟存储区域,来掉用strcpy & strcat了,当时拿手写 还是有点不适应。 但后来还是搞定了。 不过就是公司太恶心。开的薪水太恶心了
[解决办法]
char* del(char* str,char c)
{
assert(str != NULL);
char* p = str;
char* temp = new char;
char* final = temp;
while (*p != '\0 ')
{
if (*p != c)
{
*temp++ = *p++;
}
else
{
p++;
}
}
*temp = '\0 ';
return final;
}