sscanf函数和sprintf函数


 
 

一、sscanf函数

1. 函数定义

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

 

2. 函数说明

  sscanf与scanf等价,所不同的是,前者在输入字符来源于字符串s,而scanf以stdio作为输入源。
  sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。

  • str – 这是 C 字符串,是函数检索数据的源。
  • format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。format 说明符形式为 [=%[*][width][modifiers]type=],具体讲解如下:
参数描述
*这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。
width这指定了在当前读取操作中读取的最大字符数。
modifiers为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g)
type一个字符,指定了要被读取的数据类型以及数据读取方式。具体参见下一个表格。

sscanf 类型说明符:

类型合格的输入参数的类型
c单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。char *
d十进制整数:数字前面的 + 或 - 号是可选的。int *
o八进制整数。int *
e,E,f,g,G浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4float *
s字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。char *
u无符号的十进制整数。unsigned int *
x,X十六进制整数。int *

 
 

3. 常见使用方法

  1. %*d,%*s:*号表示此数据不读入,忽略掉。
sscanf("qwjy: 1024!", "%*s%d", &num);
输出:1024
  1. 取指定长度的字符串。
sscanf("qwjy: 1024!", "%2s", &str);
输出:qw
  1. 取到指定字符为止的字符串。
    例如,取到遇到j为止字符串。
sscanf("qwjy: 1024!", "%[^j]", &str);
输出:qw
  1. 寻找两个字符之间的字符串。(包含上界,不包含下界)

    寻找y到!之间的字符串,包含y到不包含!。

sscanf("qwjy: 1024!", "%*[^y]%[^!]", &str);
输出:y: 1024
  1. 取包含指定字符的字符串。

    只取小写字母和: 。

sscanf("qwjy: 1024! :qwjy", "%[a-z:]", &str);
输出:qwjy:
  1. 分割字符串
sscanf("2021:02:27", "%d:%d:%d", &a,&b,&c);
sscanf("2021:02:21 - 2021:02:27", "%s - %s", &str1,&str2);
sscanf("2021:02:21 - 2021:02:27", "%[0-9,:] - %[0-9,:]", &str1,&str2);
输出:2021 2 27
输出:2021:02:21 2021:02:27
输出:2021:02:21 2021:02:27
  1. 给定一个字符串“hello, world”,仅保留world。(“, ”之后有空格)
sscanf("hello, world", "%*s%s", &str);
输出:world
%*s过滤了hello, 
若没有空格,结果则为NULL

二、sprintf函数

1. 函数定义

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

2. 函数说明

  sprintf和平时我们常用的printf函数的功能很相似。sprintf函数打印到字符串中(要注意字符串的长度要足够容纳打印的内容,否则会出现内存溢出),而printf函数打印输出到屏幕上。
  如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

  • str – 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  • format – 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下:
specifier(说明符)输出
c字符
d 或 i有符号十进制整数
e使用 e 字符的科学科学记数法(尾数和指数)
E使用 E 字符的科学科学记数法(尾数和指数)
f十进制浮点数
g自动选择 %e 或 %f 中合适的表示法
G自动选择 %E 或 %f 中合适的表示法
o有符号八进制
s字符的字符串
u无符号十进制整数
x无符号十六进制整数
X无符号十六进制整数(大写字母)
p指针地址
n无输出
%字符
flags(标识)描述
-在给定的字段宽度内左对齐,默认是右对齐(参见 width 子说明符)。
+强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号。默认情况下,只有负数前面会显示一个 - 号。
(space)如果没有写入任何符号,则在该值前面插入一个空格。
#与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X。与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。
与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除。
0在指定填充 padding 的数字左边放置零(0),而不是空格(参见 width 子说明符)。
width(宽度)描述
(number)要输出的字符的最小数目。如果输出的值短于该数,结果会用空格填充。如果输出的值长于该数,结果不会被截断。
*宽度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。
.precision(精度)描述
.number对于整数说明符(d、i、o、u、x、X):precision 指定了要写入的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符。
对于 e、E 和 f 说明符:要在小数点后输出的小数位数。
对于 g 和 G 说明符:要输出的最大有效位数。
对于 s: 要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符。
对于 c 类型:没有任何影响。当未指定任何精度时,默认为 1。如果指定时不带有一个显式值,则假定为 0。
.*精度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。
length(长度)描述
h参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X)。
l参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)。
L参数被解释为长双精度型(仅适用于浮点数说明符:e、E、f、g 和 G)。

3. 常见使用方法

  1. 把整数165打印成一个字符串保存在s中。
sprintf(str, "%d", 123);
str="123"
  1. 控制精度
sprintf(str, "%.2f", 123456.123456);
str="123456.12"
  1. 可以将多个字符串连接成字符串
char s1[5]={'A','B','C'};
char s2[5]={'E','F','G'};
sprintf(str, "%.2s%.2s", s1,s2);

str=“ABEF”
  %m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。%m.n在浮点数中,m也表示宽度;n表示小数的位数。

  1. 生成相应的进制的字符串
sprintf(str1,"%08X", 128);
sprintf(str1,"%0*X", 8,128);

str1=“00000080”
5. 打印出i的地址

sprintf(str1,"%p", &i);
  1. 动态指定需要截取的字符数,前面介绍的打印字符、整数、浮点数等都可以动态指定那些常量值。
char s1[5]={'A','B','C'};
char s2[5]={'E','F','G'};
sprintf(str, "%.*s%.*s", 1,s1,3,s2);
sprintf(str1,"%*.*f", 1,2,123.123);
str="AEFG"
str1="123.12"
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值