Docker C语言 协程 element VBA Flutter HTTP请求 generics vbscript electron vue架构 郑州普通话考试 java商城源码 list获取最后一个元素 matlab根号怎么打出来 etl数据 excel被保护怎么解除 python正则匹配中文 matlab读入图片 python配置 python安装配置 python中get函数 python抛异常 javaswitch语句 java运行环境配置 linux用户管理 linux中sudo groupy raid0教程 小米手环充电多久 今日头条邀请码 碧桂园园宝 电脑cmd命令大全 松下plc编程软件 操作系统安装 txplatform 键盘指法练习游戏 文件分割 1500左右性价比最高的手机 一键root软件下载
当前位置: 首页 > 学习教程  > 编程语言

格式化输出字符串——sprintf

2020/11/4 14:52:28 文章标签:

sprintf()跟printf()用法很相似,打印目的地不同。前者(sprintf)是打印到字符串中,后者(printf)直接在命令行上输出。 sprintf() 是个变参函数,作用是格式化字符串。 函数原型为: …

sprintf()跟printf()用法很相似,打印目的地不同。前者(sprintf)是打印到字符串中,后者(printf)直接在命令行上输出。 sprintf() 是个变参函数,作用是格式化字符串。 

函数原型为: 

int sprintf( char* buffer, const char* format [, argument], … ); //format格式和printf()的格式控制符一样 

参数列表 

buffer:char型指针,指向将要写入的字符串的缓冲区。 
format:格式化字符串。 
[argument]…:可选参数,可以是任何类型的数据。 

返回值:

      字符串长度(strlen),打印到buffer中的字符数目 

功能: 

1. 将数字变量转换为字符串 
2. 得到整型变量的16进制和8进制字符串 
3. 连接多个字符串 

 

作用:

一:格式化字符串(常用)

char str[10] = {0};

//把整数123打印成一个字符串保存在str中
sprintf(str, "%d", 123); //输出:"123"

//可以指定宽度,不足的左边补空格:
sprintf(str, "%8d%8d", 123, 4567); //输出:"_1234567"

//当然也可以左对齐:
sprintf(str, "%-8d%8d", 123, 4567); //输出:"123_4567"

//也可以按照16进制打印:
sprintf(str, "%8x", 4567); //小写16进制,宽度占8个位置,右对齐。输出:____11d7
sprintf(str, "%-8X", 4567); //大写16进制,宽度占8个位置,左对齐。输出:11D7____

//左边补0 的等宽格式(十进制%d也可以)
sprintf(s, "%08X", 4567); //输出:"000011D7"

 

二:控制浮点数打印格式

浮点数使用格式符”%f”控制,默认保留小数点后6 位数字,比如: 
sprintf(s, "%f", 3.1415926); //输出:"3.141593" 
需要控制打印的宽度和小数位数时,使用:”%m.nf“格式。(m表示打印的宽度,n表示小数点后的位数。)

sprintf(s, "%10.3f", 3.1415626); //输出:" 3.142"
sprintf(s, "%-10.3f", 3.1415626); //输出:"3.142 "
sprintf(s, "%.3f", 3.1415626); //不指定总宽度,输出:"3.142"

int i = 100; sprintf(s, "%.2f", i); //输出:"0.00"

sprintf(s, "%.2f", (double)i); //输出:"100.00 "

spritnf 是个变参函数,除了前面两个参数之外,后面的参数都不是类型安全的。 
函数更没有办法仅仅通过一个“%f”,就能得知当初函数调用前参数压栈时,被压进来的到底是个整数还是个浮点数。 
保存整数的4字节的i,被强制当做8字节的浮点数解释了。

三:连接字符串

char s[20] = {0};
char a1[] = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘};
char a2[] = {‘H‘, ‘I‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘};
// sprintf(s, "%s%s", a1, a2); //Don‘t do that!乱码
// sprintf(s, "%7s%7s", a1, a2); //乱码
sprintf(s, "%.7s%.7s", a1, a2); //输出:"ABCDEFGHIJKLMN"
sprintf(s, "%.6s%.5s", a1, a2); //输出:"ABCDEFHIJKL"

%m.ns ≈ %m.nf: 
m 表示占用宽度(字符串长度不足时补空格,超出了则按照实际宽度打印); 
n 表示从相应的字符串中最多取用的字符数, 用的多。 
尽量使用”%.ns”的形式指定最大字符数。

动态指定取用字符长度:sprintf 采用“*”来占位[指定宽度精度的常数数字的位置]。 
于是,上面的例子可以变成: 
sprintf(s, "%.*s%.*s", 7, a1, 7, a2); 
或者: 
sprintf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);

实际上,前面介绍的打印字符、整数、浮点数等都可以动态指定那些常量值,比如:

sprintf(s, "%-*d", 4, ‘A‘); //输出:"65 "
sprintf(s, "%#0*X", 8, 128); //输出:"0X000080","#"产生0X
sprintf(s, "%*.*f", 10, 2, 3.1415926); //输出:" 3.14"

 

四:打印地址信息

调试程序时,想查看某些变量或者成员的地址。由于地址或者指针也不过是个32 位的数,可以用打印无符号整数的”%u”打印: 
sprintf(s, "%u", &i); 
用16 进制显示地址: 
sprintf(s, "%08X", &i); 
地址打印,sprintf 提供了专门的”%p”: 
sprintf(s, "%p", &i); 
≈ 
sprintf(s, "%0*x", 2 * sizeof(void *), &i);


本文链接: http://www.dtmao.cc/news_show_350252.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?