免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4489 | 回复: 15
打印 上一主题 下一主题

[函数] printf函数中重复调用自定义函数出错.请帮忙看一下. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-21 07:37 |只看该作者 |倒序浏览
我把substr()改成如下(substr()为取子字符串函数).还是不行.


  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. char * substr();

  4. main()
  5. {
  6.         static        char        AAA[]="12345678";
  7.         static        char        BBB[]="654321";
  8.         static        char        CCC[]="1x2x3x4x5x6x7x8x9xAxBx";
  9.         static        char        DDD[]="美国好莱坞市奥斯卡街二十九号";

  10. printf("|%4s|",substr(AAA,0,4));
  11. printf("%6s|",substr(BBB,0,6));
  12. printf("%13s|",substr(CCC,0,13));
  13. printf("%18s|\n",substr(DDD,0,18));

  14. printf("|%4s|%6s|%13s|%18s|\n",substr(AAA,0,4),substr(BBB,0,6),substr(CCC,0,13),substr(DDD,0,18) );

  15. }

  16. char * substr(char *source_string, int start_pos, int target_string_len)
  17. {
  18.         char        target_string[81];

  19. //        memset(target_string,0x0,sizeof(target_string));

  20.         strncpy(target_string,source_string,target_string_len);

  21.         return (target_string);
  22. }
复制代码


前面4个printf运行正常.

论坛徽章:
0
2 [报告]
发表于 2004-04-21 08:39 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

target_string 定义为了局部变量,定义成全局变量试试

论坛徽章:
0
3 [报告]
发表于 2004-04-21 08:44 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

$ gcc printf.c
printf.c:30: warning: function returns address of local variable

这个警告信息就是关键所在.

论坛徽章:
0
4 [报告]
发表于 2004-04-21 09:34 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

你的程序有两个问题:
1.substr函数的返回有问题,target_string是局部变量,不能返回。
2.即使你把target_string改成全局或静态,第5个printf依然不行,因为printf只会打印出最后一次substr的结果,不是你想要的,这部分你还要好好看看书。

要达到你的要求,可以把第五个printf的format改一下。

论坛徽章:
0
5 [报告]
发表于 2004-04-21 17:37 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

那我暂时一个一个printf好了,因为这样它工作得很好-虽然target_string是局部变量,但它也正确返回了.(sco openserver5.0.x / 自带的开发系统)
这是我的取子字符串函数-substr():


  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. char * substr();

  4. main()
  5. {
  6.         .
  7.         .
  8.         .
  9. }


  10. char * substr(char *source_string, int start_pos, int target_string_len)
  11. {
  12.         int        source_string_len,i;
  13.         char        target_string[81];

  14.         source_string_len=strlen(source_string);

  15.         i=0;       
  16.         if ( source_string_len >; start_pos && target_string_len < 81 )
  17.         {

  18.                 for ( i=0; i < target_string_len && source_string[start_pos+i] != '\0' ; i++ )
  19.                         target_string[i]=source_string[start_pos+i];
  20.         }
  21.         target_string[i]='\0';

  22.         return (target_string);
  23. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2004-04-21 17:48 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

有潜在危险哦,避免危险的方法是把target_string定义成static。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2004-04-21 17:49 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

[quote]原帖由 "duleell"]虽然target_string是局部变量,但它也正确返回了[/quote 发表:

你等着吧!有你吃苦头的时候。

论坛徽章:
0
8 [报告]
发表于 2004-04-21 18:02 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

原帖由 "flw" 发表:

你等着吧!有你吃苦头的时候。


呵呵,严重同意!

论坛徽章:
0
9 [报告]
发表于 2004-04-21 18:51 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

真的?
其实它返回的是target_string在内存中的地址,有什么不对吗?

论坛徽章:
0
10 [报告]
发表于 2004-04-21 20:23 |只看该作者

printf函数中重复调用自定义函数出错.请帮忙看一下.

建议看书,看看函数能够返回什么类型变量的地址。
其实FH已经说得很清楚了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP