Sprintf占用的空间比打印的多?

时间:2014-05-13 14:36:52

标签: c++ c arduino printf

我正在做一个Arduino草图,我正试图获得一些空间。我在某些网站上看到,使用sprintf比使用print更好。我尝试过,但它需要更多的空间。

例如:

  char toWrite[18];
  sprintf(toWrite,"%d/%d/%d %d:%d:%d",RTC.now().day(),RTC.now().month(),RTC.now().year()-2000,RTC.now().hour(),RTC.now().minute(),RTC.now().second());
  tft.println(toWrite);

占用的空间比:

  tft.print(RTC.now().day(), DEC);
  tft.print('/');
  tft.print(RTC.now().month(), DEC);
  tft.print('/');
  tft.print(RTC.now().year(), DEC);
  tft.print(' ');
  tft.print(RTC.now().hour(), DEC);
  tft.print(':');
  tft.print(RTC.now().minute(), DEC);
  tft.print(':');
  tft.println(RTC.now().second(), DEC);
  tft.println();

有些人可以解释一下为什么吗?

非常感谢!

PS:对不起我的英语,这不是我的母语=)

2 个答案:

答案 0 :(得分:0)

例程sprintf更大,因为它比打印更复杂(也更灵活)的例程。您可以通过更严格的打印语句使代码更小。不幸的是,在这种情况下没有免费的午餐。

答案 1 :(得分:0)

如果删除无关的格式,你可以真正减少printf 下面是一个示例替代fprintf(printf只是fprintf,其中1为第一个arg),编译为1 / 2kb,包括我的转换函数(如果你删除更多,它可能会更小)

void myfprintf_(int fd,int nargs, ...){ 
   va_list ap; va_start(ap, nargs); static char *s; const char *fmt; 
   fmt=va_arg(ap, char *); 
   int i=0,p; 
   char buf[80]; 
while (fmt[i]){ 
   p=0; 
   while (fmt[i]!='%' && fmt[i]!=0) buf[p++]=fmt[i++]; 
   if (p != 0) write(fd,buf,p); 
   if (nargs-->0){ 
      switch (fmt[++i]) { 
      case 's': s=va_arg(ap, char *); break; 
      case 'd': s=dtos(va_arg(ap, int)); break; 
      case 'x': s=dtox(va_arg(ap, int),'a'); break; 
      case 'X': s=dtox(va_arg(ap, int),'A' ); break; 
      case 'f': s=ftos(va_arg(ap, double)); break; 
      case 'c': buf[0]=(va_arg(ap, int));buf[1]=0;s=buf;break; 
      case '%': s="%"; break; 
      default : s="";break; 
      } write(fd,s,strlen(s)); 
   } 
i++; 
} 
va_end(ap); 
}

只需注释掉您不需要的格式并修改现有的转换函数 - 如果您希望它更符合要求,请将其设置为int函数vs void并将返回值的write返回值相加。虽然99%的时间我不使用printf的回报。