Sprintf函数的用法

更新时间:2023-06-17 11:45:25 阅读: 评论:0

Sprintf函数的用法:
函数简介:
函数功能:把格式化的数据写入某个字符串
  头文件:stdio.h
  函数原型:int sprintf( char *buffer, const char *format, [ argument] … ) ;
返回值:字符串长度(strlen)
参数说明及应用举例
  sprintf格式的规格如下所示。[]中的部分是可选的。
  %[指定参数][标识符][宽度][.精度]指示符
  若想输出`%'本身时, 请这样`%%'处理。
  1. 处理字符方向。负号时表示从后向前处理。
  2. 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。
  3. 字符总宽度。为最小宽度。
  4. 精确度。指在小数点后的浮点数位数。
  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
转换字符
  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  %% 印出百分比符号,不转换。
30字超短小故事
  %c 整数转成对应的 ASCII 字元。
  %d 整数转成十进位。
  %f 倍精确度数字转成浮点数。
  %o 整数转成八进位。
  %s 整数转成字符串。
  %x 整数转成小写十六进位。
%X 整数转成大写十六进位。
我们的用法:
Uchar sf[20],sd[20];
d=124;
a = sprintf(sf,"%.0f",d);  // Long(Int) 到 char字符串
d=12422.422;
a = sprintf(sd,"%f",d);  // float 到 char字符串
a = sprintf(sd,"%.6f",d);  // float 到 char字符串
这两句相等;即浮点型转换时,小数位不指定情况下为最大6位;
注意:写信祝福语以防sd缓冲区溢出,待转换数据先做判断,大于0xFFFFFFFF
4.      打印地址信息
有时调试程序时,我们可能想查看某些变量或者成员的地址,由于地址或者指针也不过是个32位的数,你完全可以使用打印无符号整数的”%u”把他们打印出来:
sprintf(s, "%u", &i);
不过通常人们还是喜欢使用16进制而不是10进制来显示一个地址:
杨子仪
sprintf(s, "%08X", &i);
然而,这些都是间接的方法,对于地址打印,sprintf 提供了专门的”%p”:
sprintf(s, "%p", &i);
我觉得它实际上就相当于:
sprintf(s, "%0*x", 2 * sizeof(void *), &i);
5.      利用sprintf的返回值
较少有人注意printf/sprintf函数的返回值,但有时它却是有用的,spritnf返回了本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf调用结束以后,你无须再调用一次strlen便已经知道了结果字符串的长度。如:
int len = sprintf(s, "%d", i);
对于正整数来说,len便等于整数i的10进制位数。
下面的是个完整的例子,产生10个[0, 100)之间的随机数,并将他们打印到一个字符数组s中,以逗号分隔开。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
    srand(time(0));
    char s[64];
    int offt = 0;
    for(int i = 0; i < 10; i++) {
      offt += sprintf(s + offt, "%d,", rand() % 100);
    }
    s[offt - 1] = '\n';//将最后一个逗号换成换行符。
南非人
    printf(s);
    return 0;
}
地球最冷的一天
设想当你从数据库中取出一条记录,然后希望把他们的各 个字段按照某种规则连接成一个字符串时,就可以使用这种方法,从理论上讲,他应该比不断的strcat效率高,因为strcat每次调用都需要先找到最后 的那个’\0’的位置,而在上面给出的例子中,我们每次都利用sprintf返回值把这个位置直接记下来了。
6.      使用sprintf的常见问题
sprintf是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。
Ø         缓冲区溢出
第一个参数的长度太短了,没的说,给个大点的地方吧。当然也可能是后面的参数的问题,建议变参对应一定要细心,而打印字符串时,尽量使用”%.ns”的形式指定最大字符数。
Ø         忘记了第一个参数
低级得不能再低级问题,用printf用得太惯了。//偶就常犯。:。(
Ø         变参对应出问题
通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤其是对应”*”的那些参数,都提供了吗?不要把一个整数对应一个”%s”,编译器会觉得你欺她太甚了(编译器是obj和exe的妈妈,应该是个女的,:P)。
7.      strftime
sprintf还有个不错的表妹:strftime,专门用于格式化时间字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是毕竟小姑娘家心细,她还要调用者指定缓冲区的最大长度,可能是为了在出现问题时可以推卸责任吧。这里举个例子:
time_t t = time(0);
//产生"YYYY-MM-DD hh:mm:ss"格式的字符串。
char s[32];
鲤鱼打挺怎么练strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,这一对由于从面向对象哪里得到了赞助,用以写出的代码更觉优雅。
8.      后记
本文介绍的所有这些功能,在MSDN中都可以很容易地查到,笔者只是根据自己的使用经验,结合一些例子,把一些常用的,有用的,而可能为许多初学者所不知的用法介绍了一点,希望大家不要笑话,也希望大家批评指正。
有人认为这种带变参的函数会引起各种问题,因而不提倡使用。但笔者本人每每还是抵挡不了它们强大功能的诱惑,在实际工作中一直在使用。实际上,C#从开始就支持变参,刚发布不久的Java5.0也支持变参了。
感谢ericzhangali(另一个空间)仔细审阅了全稿,纠正了很多小错误,并提出了一些建议。也感谢laomai(老迈)阅读了全稿并给出了增删一些内容的建议。
获取System时间: void GetSystemTime(LPSYSTEMTIME lpSystemTime); 下面是例子: 
#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
void main() { 
SYSTEMTIME st; //定义存放时间的结构体 
char strTime[256]; 
int n=0; 
GetSystemTime(&st); 
n = sprintf(strTime,"Year:\t%d\n",st.wYear); 
n += sprintf(strTime+n,"Month:\t%d\n",st.wMonth); 
n += sprintf(strTime+n,"Day:\t%d\n",st.wDay); 
n += sprintf(strTime+n,"Date:\t%d\n",st.wDayOfWeek); 
n += sprintf(strTime+n,"Hour:\t%d\n",st.wHour); 
n += sprintf(strTime+n,"Minute:\t%d\n",st.wMinute); 
n += sprintf(strTime+n,"Second:\t%d\n",st.wSecond); 
n += sprintf(strTime+n,"MilliSecond:\t%d\n",st.wMilliconds); 
printf("%s",strTime); 
system("pau"); 
******************************************
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出 
参数个数一样多, 各参数之间用","分开, 且顺序一一对应,  否则将会出现意想 
不到的错误。 
    1. 格式化规定符 
    Turbo C2.0提供的格式化规定符如下: 
━━━━━━━━━━━━━━━━━━━━━━━━━━ 
如何共享文件夹到另一台电脑
    符号                  作用 
────────────────────────── 
    %d              十进制有符号整数 
    %u              十进制无符号整数 
    %f              浮点数 
    %s              字符串 
    %c              单个字符 赐予的近义词
    %p              指针的值 
    %e              指数形式的浮点数 
    %x, %X          无符号以十六进制表示的整数 
    %0              无符号以八进制表示的整数 
    %g              自动选择合适的表示法 
━━━━━━━━━━━━━━━━━━━━━━━━━━ 
    说明: 
    (1). 可以在"%"和字母之间插进数字表示最大场宽。 
      例如:  %3d    表示输出3位整型数, 不够3位右对齐。 
            %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 
                  小数点占一位, 不够9位右对齐。 
            %8s    表示输出8个字符的字符串, 不够8个字符右对齐。 

本文发布于:2023-06-17 11:45:25,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1042451.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字符串   整数   参数   表示
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图