浮点型格式符,代表浮点数的格式符

首页 > 大全 > 作者:YD1662022-12-20 05:24:38

将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。

由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致 sprintf 比 printf 有用得多。

sprintf是个变参函数,定义如下:

int sprintf( char *buffer, const char *format [, argument] … );

除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。

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

1、格式化数字字符串

sprintf最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa。如:

// 把整数123打印成一个字符串保存在s中。

sprintf(s, "%d", 123); // 产生"123"

2、控制浮点数打印格式

浮点数的打印和格式控制是 sprintf 的又一大常用功能,浮点数使用格式符“%f”控制,默认保留小数点后6位数字,比如:

sprintf(s, "%f", 3.1415926); // 产生 "3.141593"

但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:“%m.nf”格式,其中m表示打印的宽度,n表示小数点后的位数。比如:

sprintf(s, ".3f", 3.1415626); // 产生:" 3.142″

3、连接字符串

sprintf的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能够连接字符串,从而在许多场合可以替代 strcat,但 sprintf 能够一次连接多个字符串(自然也可以同时在它们中间插入别的内容,总之非常灵活)。比如:

char *who = "I";

char *whom = "52PHP";

sprintf(s, "%s love %s.", who, whom); // 产生:"I love 52PHP. "

打印整数和浮点数时可以指定宽度:

char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};

char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};

sprintf(s, "%.7s%.7s", a1, a2); // 产生:"ABCDEFGHIJKLMN"

或者

sprintf(s, "%.*s%.*s", 7, a1, 7, a2); or

sprintf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);

4、利用sprintf的返回值

spritnf 返回了本次函数调用最终打印到字符缓冲区中的字符数目

int len = sprintf(s, "%d", i);

二、snprintf() 详解

函数原型:

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);

函数说明:最多从源串中拷贝 n-1 个字符到目标串中,然后再在后面加一个 '\0'。所以如果目标串的大小为 n 的话,将不会溢出。

函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

1、推荐的用法

#include <stdio.h>

int main(int argc, char **argv)

{

char str[10] = {0,};

snprintf(str, sizeof(str), "0123456789012345678");

printf("str=%s\n", str);

return 0;

}

输出:

str=012345678

2、snprintf() 函数返回值的测试:

#include <stdio.h>

#include <string.h>

int main(int argc, char **argv)

{

char str1[10] = {0,};

char str2[10] = {0,};

int ret1 = 0, ret2 = 0;

ret1 = snprintf(str1, sizeof(str1), "%s", "abc");

ret2 = snprintf(str2, 4, "%s", "aaabbbccc");

printf("aaabbbccc length=%d\n", strlen("aaabbbccc"));

printf("str1=%s,ret1=%d\n", str1, ret1);

printf("str2=%s,ret2=%d\n", str2, ret2);

return 0;

}

输出:

aaabbbccc length=9

str1=abc,ret1=3

str2=aaa,ret2=9

特别注意:

snprintf() 的返回值是欲写入的字符串长度,而不是实际写入的字符串度。如:

#include <stdio.h>

int main(int argc, char **argv)

{

char test[8];

int ret = snprintf(test, 5, "1234567890");

printf("%d|%s\n", ret, test);

return 0;

}

输出:

10|1234

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.