看看这个小程序有问题没?删除字符串里指定字符

liaopan77 2007-06-15 07:18:08
#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 返回指针应该有问题吧?
请大家讨论和指点下!
...全文
430 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
milksea 2007-06-16
  • 打赏
  • 举报
回复
并没有在栈上“分配”内存,你返回的指针指向的那部分内存是原来就用参数s传进函数的。
liaopan77 2007-06-16
  • 打赏
  • 举报
回复
明白啦,呵呵,谢谢各位!
mdejtod 2007-06-16
  • 打赏
  • 举报
回复
函数的返回类型是指针哪....
spiderfinger 2007-06-16
  • 打赏
  • 举报
回复
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;
}
softwarewander 2007-06-16
  • 打赏
  • 举报
回复
我以前在面试的时候写过一个函数,跟这个差不多的。
我就是直接将后面的字符前移,最麻烦的就是往前移多少。这样不需要在另外开辟存储区域,来掉用strcpy & strcat了,当时拿手写 还是有点不适应。 但后来还是搞定了。 不过就是公司太恶心。开的薪水太恶心了
softwarewander 2007-06-16
  • 打赏
  • 举报
回复
lz的代码从哪来的, 有问题吧

hello word
如果要删除o呢?

那应该是hell wrd 次函数怎么可能完成呢?
cceczjxy 2007-06-16
  • 打赏
  • 举报
回复


没问题;
关键是你所有的指针都是指向"Hello,world"这个字符串变量.
当return ppPtr时,实际上是返回的"Hello,world"的地址,ppPtr这个变量值在pStr= fun(szTemp, 'H'); 这一句结束前都是有效的.
liaopan77 2007-06-15
  • 打赏
  • 举报
回复
但是。。。
我们在函数内部
char *ppPtr=p; 在贱上 分配了内存撒?

不是说函数返回指针必须是 堆区或者全局静态数据区么?
谁能来解释下阿?
milksea 2007-06-15
  • 打赏
  • 举报
回复
木有问题。

返回指针这件事不会产生问题。产生问题的代码是返回指向临时数据(如函数内定义的auto变量、数组)的指针。不要混淆了。
ayw215 2007-06-15
  • 打赏
  • 举报
回复
木有问题,鉴定完毕

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧