免费注册 查看新帖 |

Chinaunix

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

搞了半天,printf都没搞懂。唉。 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-25 21:12 |只看该作者 |倒序浏览
今天写一个fprintf(fp, "%s%s%s", f(a), f(b), f(c));
发现不同的a,b,c得到的f()返回值都一样。为什么呢?
我的f()里返回的是一个static 变量,可每次也都会memset为0亚。不大理解为什么不会改变。

论坛徽章:
0
2 [报告]
发表于 2006-04-25 21:33 |只看该作者
你不是自己都说了,是static的变量

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-04-25 21:39 |只看该作者
能把代码发上来吗?

论坛徽章:
0
4 [报告]
发表于 2006-04-25 21:45 |只看该作者
会先执行 f(a) f(b) f(c)
然后才执行 printf

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-04-25 22:11 |只看该作者
运行结果
./a.out
12.24
12,222.23
43,242,442.00
12.24
12.24
12.24
  1. int main()
  2. {
  3.     double a = 12.24;
  4.     double b = 12222.2323;
  5.     double c = 43242442;
  6.     char buff[20] = {0};
  7.     char buff1[20] = {0};
  8.     char buff2[20] = {0};

  9.     memset(buff, 0, sizeof(buff));
  10.     memset(buff1, 0, sizeof(buff1));
  11.     memset(buff2, 0, sizeof(buff2));

  12.     strcpy(buff, FormatMoney(a));
  13.     strcpy(buff1, FormatMoney(b));
  14.     strcpy(buff2, FormatMoney(c));

  15.     fprintf(stderr, "%s\n%s\n%s\n", buff, buff1, buff2);
  16.     fprintf(stderr, "%s\n%s\n%s\n", FormatMoney(a), FormatMoney(b), FormatMoney(c));

  17. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-04-25 22:17 |只看该作者
你不把FormatMoney贴出来有什么用呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2006-04-25 22:22 |只看该作者
原帖由 lenovo 于 2006-4-25 22:17 发表
你不把FormatMoney贴出来有什么用呢?

因为我看到上面的程序可以说明问题了,单独调用并没有问题啊。用fprintf时才出问题了的亚。
不过还是把程序帖出来吧(因为不是我写的,所以。。。)
  1. char * FormatMoney(double pamount)
  2. {
  3.     char tmp[16],buf[17],buffer[24];
  4.     char amount[32];
  5.     static char formatm[64];
  6.     int len, i,j,k;

  7.     memset(formatm, 0, sizeof(formatm));
  8.     sprintf( amount, "%.0lf", pamount * 100 );
  9.     len=strlen(amount);

  10.     if( (len > 15) || (len ==0 ) )
  11.         return NULL;

  12.     strcpy(tmp,amount);

  13.     if(len<=2){
  14.         sprintf(formatm,"0.%02d",atoi(tmp));
  15.         return formatm;
  16.     }
  17.     else
  18.         sprintf(formatm,".%s",tmp+len-2);

  19.     tmp[len-2]=0;
  20.     len-=2;
  21.     if(len<=3){
  22.         strcpy(buffer,formatm);   
  23.         sprintf(formatm,"%s%s",tmp,buffer);
  24.         return formatm;
  25.     }

  26.     j=len/3;
  27.     k=len%3;
  28.     i=0;

  29.     while(1){
  30.         strcpy(buffer,formatm);   
  31.         if(i!=j){
  32.             strcpy(buf,tmp+k+3*(j-i-1));
  33.             if(i==0)
  34.                 sprintf(formatm,"%s%s",buf,buffer);
  35.             else
  36.                 sprintf(formatm,"%s,%s",buf,buffer);
  37.             tmp[k+3*(j-i-1)]=0;
  38.             i++;
  39.         }
  40.         else{
  41.             if(k==0)
  42.                 break;
  43.             strcpy(buf,tmp);
  44.             sprintf(formatm,"%s,%s",buf,buffer);
  45.             break;
  46.         }

  47.     }

  48.     return formatm;
  49. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-04-25 22:37 |只看该作者
明白了,还是那个static变量的问题,
当你在fprintf中一起调用formatmoney时,
最后一次调用会把以前调用的结果覆盖。
因为它们用的是同一块内存。

论坛徽章:
0
9 [报告]
发表于 2006-04-25 22:50 |只看该作者
写得还蛮复杂的:)

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2006-04-25 23:40 |只看该作者
原帖由 lenovo 于 2006-4-25 22:37 发表
明白了,还是那个static变量的问题,
当你在fprintf中一起调用formatmoney时,
最后一次调用会把以前调用的结果覆盖。
因为它们用的是同一块内存。

嗯,谢谢,像这种情况下(要有这样的函数原型又要适应这样的调用)如果我不想传一个buff参数来存放结果,有没有其它的写法呢?
虽然有一个不大好的办法就是定义一个static变量数组,数组的维数是在一个fprintf中不可能同时用到的最大个数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP