Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171261
  • 博文数量: 44
  • 博客积分: 2762
  • 博客等级: 少校
  • 技术积分: 520
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-04 19:19
文章分类
文章存档

2011年(28)

2010年(16)

我的朋友

分类: C/C++

2010-11-09 09:55:18

以前用的比较多的就是prinft,在做appli应用开发的时候,碰到很多情况需要将字符串显示在指定的位置上,而不仅仅是光显示在标准输入输出。
参考manpage printf可以看到除了printf外,还有

#include <>

int printf(const char *format, ...);
int fprintf(FILE *
stream, const char *format, ...);
int sprintf(char *
str, const char *format, ...);
int snprintf(char *
str, size_t size, const char *format, ...);

等等,这里只讲讲开发中用到的sprintf。

int sprintf(char *str, const char *format, ...);

printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的
格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终
函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

利用sprintf 的返回值
较少有人注意printf/sprintf 函数的返回值,但有时它却是有用的,spritnf 返回了本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf 调用结束以后,你无须再调用一次
strlen 便已经知道了结果字符串的长度


605 switch(*(opt_str+i)){
606 case ' ': /* (space) */
607 *tp++ = ' ';
608 break;
609 case 'Y': /* 4峰钳 */
610 tp += sprintf(tp,"%4d",timenow->tm_year + 1900);
611 if(*(opt_str+i+1) == 'Y' || *(opt_str+i+1) == 'L' || *(opt_str+i+1) == 'D' || *(opt_str+i+1) == 'y'){
612 if(APL_ENV_IsDateSeparationMark()) *tp++ = '.';
613 else *tp++ = '/';
614 }
615 break;
616 case 'y': /* 2峰钳 */
617 tp += sprintf(tp,"%02d",(timenow->tm_year + 1900)%100);
618 if(*(opt_str+i+1) == 'Y' || *(opt_str+i+1) == 'L' || *(opt_str+i+1) == 'D' || *(opt_str+i+1) == 'y'){
619 if(APL_ENV_IsDateSeparationMark()) *tp++ = '.';
620 else *tp++ = '/';
621 }
622 break;


其中的这一句
tp += sprintf(tp,"%4d",timenow->tm_year + 1900);
就是利用了
sprintf的返回值,将系统时间的年信息以4为整形数据的形式打印到指针类型的tp中,
然后tp加上
sprintf的返回值,也就是加上这次打印的字符的个数,即将tp指向了字符串的尾部,以为下一次的继续打印做准备。




阅读(2591) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~