sprintf
功能
原型
int sprintf( char *buffer, const char *format, [ argument] … );
参数列表
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据。
返回值
返回写入buffer 的字符数,出错则返回-1.
sprintf 常见用法
- 格式化数字字符串
//把整数123打印成一个字符串保存在s中。 sprintf(s, "%d", 123); // "123" //可以指定宽度,不足的左边补空格: sprintf(s, "%8d%8d", 123, 4567); // " 123 4567" //当然也可以左对齐: sprintf(s, "%-8d%8d", 123, 4567); // "123 4567" //也可以按照16进制打印: sprintf(s, "%8x", 4567); //小写16进制,宽度占8个位置,右对齐 sprintf(s, "%-8X", 4568); //大写16进制,宽度占8个位置,左对齐
- 控制浮点数打印格式(默认保留小数点后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 = 123;
sprintf(s, "%.3f", i);
其结果是什么? “0.000”。。
原因是参数压栈时调用者并不知道跟 i 相对应的格式控制符是个”%f”。而函数执行时函数本身则并不知道当年被压入栈里的是个整数,于是保存整数 i 的那4个字节就被强行作为浮点数格式来解释了,导致出错了
sprintf(s, "%.3f", (float)i); // 结果为 "123.000"
sscanf
功能
sscanf 读取格式化的字符串中的数据。
sscanf 常见用法
- 常见用法
char buf[512]; sscanf("123456 ", "%s", buf); printf("%s\n", buf); // "123456"
- 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串
sscanf("123456 ", "%4s", buf); printf("%s\n", buf); // "1234"
- 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串
sscanf("123456 abcdedf", "%[^ ]", buf); printf("%s\n", buf); // "123456"
- 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); printf("%s\n", buf); // "123456abcdedf" char s[] = "abcdef 1987:10:20"; char buf[512]; sscanf(s, "%[a-z0-9, ,:]", buf); // "abcdef 1987:10:20"
- 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); printf("%s\n", buf); // "123456abcdedf"
- 给定一个字符串”iios/12DDWDFF@122”,获取 / 和 @ 之间的字符串,先将 “iios/”过滤掉,再将非’@’的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); printf("%s\n", buf); // "12DDWDFF"
- 给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,如果没有空格则结果为NULL。 printf("%s\n", buf); // "world"
参考:突然好想晒太阳