编译出错,大家帮忙看看

henryluo 2004-04-19 12:49:22
下面的函数目地是搜索第N个子串出现的位置,并截掉后面或前面部份(用N是正负表示)在做成一个程序时测试成功,但在做成函数形式时,编译出错,大家帮我看看,谢谢了



[root@localhost livecore.cc]# cat trimrstr.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
char link[500];
char *string="<TR><td width=25><img src=img/space.gif border=0 width=1height=2></td><TD class=menuCountry><A class=menuLink href=index.php?s=21&lang=en&id=&g=s&g_m=s&g_i=&l=&c=16&live=true&result=><B>USA</B></A></TD><td width=15><img src=img/space.gif border=0 width=1 height=2></td></TR>";
int repeat=3;
char *sub="img";
strcpy(link,trimstr(string,repeat,sub));
printf("%s",link);
}


char *
trimstr(char *string,int repeat,char *sub)
{

char *current;
char *last;
char dest[strlen(string)];
int i;

printf("%s\n\n",string);
current=string;
for (i=1;i <= abs(repeat);i++)
{
last = current;
current=strstr(last+1,sub);
}
if (repeat > 0)
{
memcpy(dest,current+strlen(sub),strlen(current+strlen(sub)));
}
else
{
memcpy(dest,string,strlen(string)-strlen(current));
}
printf("%s\n",dest);
return dest;
}




编译出错信息如下
[root@localhost livecore.cc]# gcc trimrstr.c
trimrstr.c: In function `main':
trimrstr.c:11: warning: passing arg 2 of `strcpy' makes pointer from integer without a cast
trimrstr.c: At top level:
trimrstr.c:18: warning: type mismatch with previous implicit declaration
trimrstr.c:11: warning: previous implicit declaration of `trimstr'
trimrstr.c:18: warning: `trimstr' was previously implicitly declared to return `int'
trimrstr.c: In function `trimstr':
trimrstr.c:41: warning: function returns address of local variable


...全文
51 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixiaohua 2004-04-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *trimstr(char *, int, char*);
void main()
{
char link[500];
char *string="<TR><td width=25><img src=img/space.gif border=0 width=1height=2></td><TD class=menuCountry><A class=menuLink href=index.php?s=21&lang=en&id=&g=s&g_m=s&g_i=&l=&c=16&live=true&result=><B>USA</B></A></TD><td width=15><img src=img/space.gif border=0 width=1 height=2></td></TR>";
int repeat=3;
char *sub="img";
strcpy(link,trimstr(string,repeat,sub));
printf("%s",link);
}


char *
trimstr(char *string,int repeat,char *sub)
{

char *current;
char *last;
char dest[strlen(string)];
int i;

printf("%s\n\n",string);
current=string;
for (i=1;i <= abs(repeat);i++)
{
last = current;
current=strstr(last+1,sub);
}
if (repeat > 0)
{
memcpy(dest,current+strlen(sub),strlen(current+strlen(sub)));
}
else
{
memcpy(dest,string,strlen(string)-strlen(current));
}
printf("%s\n",dest);
return dest;
}
weixiaohua 2004-04-19
  • 打赏
  • 举报
回复
//函数未定义!先声明下就OK了!
char *trimstr(char *, int, char*);
int main()
{
char link[500];
char *string="<TR><td width=25><img src=img/space.gif border=0 width=1height=2></td><TD class=menuCountry><A class=menuLink href=index.php?s=21&lang=en&id=&g=s&g_m=s&g_i=&l=&c=16&live=true&result=><B>USA</B></A></TD><td width=15><img src=img/space.gif border=0 width=1 height=2></td></TR>";
int repeat=3;
char *sub="img";
strcpy(link,trimstr(string,repeat,sub));
printf("%s",link);
getchar();
return 0;
}


char *
trimstr(char *string,int repeat,char *sub)
{

char *current;
char *last;
char dest[strlen(string)];
int i;

printf("%s\n\n",string);
current=string;
for (i=1;i <= abs(repeat);i++)
{
last = current;
current=strstr(last+1,sub);
}
if (repeat > 0)
{
memcpy(dest,current+strlen(sub),strlen(current+strlen(sub)));
}
else
{
memcpy(dest,string,strlen(string)-strlen(current));
}
printf("%s\n",dest);
return dest;
}
pacman2000 2004-04-19
  • 打赏
  • 举报
回复
可以参照strcpy()对参数的做法。dest就是从函数外面传进来的。
freefalcon 2004-04-19
  • 打赏
  • 举报
回复
trimrstr.c: In function `trimstr':
^^^^^^^^^^^^^^^^^^
trimrstr.c:42: warning: function returns address of local variable
^^^^^^^^^^^^
返回的是局部变量,函数执行完毕后就无效了
根据你的情况,或者通过参数传入、或者使用局部静态变量,或者在函数内动态申请
henryluo 2004-04-19
  • 打赏
  • 举报
回复
加上了声明,还会出如下错误,怎么解决比较好
[root@localhost livecore.cc]# gcc trimrstr.c
trimrstr.c: In function `trimstr':
trimrstr.c:42: warning: function returns address of local variable
gaoxianfeng 2004-04-19
  • 打赏
  • 举报
回复
应该 动态分配 地址
或是从入口带进来的地址
庄鱼 2004-04-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//-------------------------------------------------------
#define MaxNum 4096
char Buf[MaxNum];

char *trimstr(char *string,int repeat,char *sub);
//-------------------------------------------------------
main()
{
...
}

char* trimstr(char *string,int repeat,char *sub)
{

char *current;
char *last;
//-------------------------------------------------------
char *dest=Buf;
//-------------------------------------------------------
int i;
...
}
数组不能够用变量给定大小,除非用动态指针管理,但是当函数结束的时候,空间已经释放,指针指向的内容不可用,如果不释放,将会不停的消耗资源,最终吃掉内存。函数内部的指针申请仅仅用于只限函数内部使用的情况或通过参数传递的情况,而不能够用返回指针情况。解决的方法是,一次性的申请一块足够大的公共内存空间作为程序运行期间的数据交换缓冲池。
mrubbish 2004-04-19
  • 打赏
  • 举报
回复
char *current;
char *last;
char *dest;
int i;
dest = (char*)malloc(sizeof(char)*strlen(string));
........
return(dest)
动态分配的,可以参考一下

69,381

社区成员

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

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