C语言中sprintf()函数的用法

 2024-01-28 00:05:45  阅读 0

功能使用

1、该函数包含在stdio.h头文件中。

2、功能和我们常用的功能很相似。 函数打印到一个字符串(注意字符串的长度必须足以容纳打印的内容,否则会发生内存溢出),函数将输出打印到屏幕上。 我们的操作中广泛使用函数来将其他数据类型转换为字符串类型。

3、函数格式:

int (char *, const char * [, ,…] );

除了前两个参数是固定的之外,可选参数可以是任意数量。 它是一个字符数组名称; 是一个格式字符串(如:“%3d%6.2f%#x%o”,当%和#一起使用时,在十六进制数前面自动添加0x)。 只要格式字符串可以用在 中,就可以用在 中。 格式字符串是这个函数的本质。

两者都使用格式字符串来指定字符串的格式。 使用一些以“%”开头的格式说明符来占据格式字符串内的位置。 在下面的变量参数列表中提供相应的变量。 最终函数将使用相应位置的变量替换该说明符,产生调用者想要的字符串。

4.可控制精度

字符str[20];

f=14。;

(str,"%6.2f",f);

5.可连接多个数值数据

字符str[20];

int a=20984,b=48090;

(str,"%3d%6d",a,b);

str[]=”20984 48090”

6.多个字符串可以拼接成字符串

字符str[20];

char s1[5]={'A','B','C'};

char s2[5]={'T','Y','x'};

(str,"%.3s%.3s",s1,s2);

%mn字符串的输出中,m表示字符串的宽度和所占的列数; n代表实际的字符数。 %mn在浮点数中,m也代表宽度; n 代表小数位数。

7、可以动态指定需要截取的字符数。

字符str[20];

char s1[5]={'A','B','C'};

char s2[5]={'T','Y','x'};

(str,"%.*s%.*s",2,s1,3,s2);

(str, “%*.*f”, 10, 2, 3.);

8. 可以打印出i的地址

字符str[20];

整数我;

(str, “%p”, &i);

上面的语句相当于

(str, “%0*x”, 2 * (void *), &i);

9、返回值是字符数组中的字符数,即字符串的长度。 无需调用 (str) 来查找字符串的长度。

10、使用字符指针指向的字符串来接收打印的内容

例子:

int main()
{
    int ddd=666;
    char *buffer=NULL;    
    if((buffer = (char *)malloc(80*sizeof(char)))==NULL)
    {
        printf("malloc error\n");
    }
    sprintf(buffer, "The value of ddd = %d", ddd);//The value of ddd = 666
    printf("%s\n",buffer);
    free(buffer);
    buffer=NULL;
    return 0;
}

当指针第一次定义时,它并不指向该位置。 它可以指向一个变量然后使用它。 如果你想简单地使用这个指针,那么你需要为这个指针分配一块内存。 如果添加的话需要添加.h

11.想象一下,当你从数据库中取出一条记录,然后想将它们的字段按照一定的规则连接成一个字符串时,可以使用这种方法。 理论上应该效率更高,因为每次调用都需要先找到最后一个字符串结束符'\0的位置。 在上面给出的例子中,我们每次都使用返回值直接记录这个位置。

例子:

void main(void)
{ 
    char buffer[200], s[] = "computer", c = 'l'; 
    int i = 35, j; 
    float fp = 1.7320534f; // 
    j = sprintf( buffer, " String: %s\n", s ); // 
    j += sprintf( buffer + j, " Character: %c\n", c ); // 
    j += sprintf( buffer + j, " Integer: %d\n", i ); // 
    j += sprintf( buffer + j, " Real: %f\n", fp );// 
    printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}

本例将格式控制块中所有定义的数据和字符连接在一起,最终打印出字符串的内容和字符数。

结果如图所示:

12.格式化数字字符串

最常见的应用之一是将整数打印到字符串。 喜欢:

(1) 将整数123打印成字符串,保存在s中。

(s,“%d”,123); //产生“123”

(2) 可以指定宽度,如果左边不足则补空格:

(s, “%8d%8d”, 123, 4567); //产生:“123 4567”

当然,你也可以左对齐:

(s, “%-8d%8d”, 123, 4567); //产生:“123 4567”

(3)也可以以十六进制格式打印:

(s,“%8x”,4567); //小写十六进制,宽度占8位,右对齐

(s,“%-8X”,4568); //大写十六进制,宽度占8个位置,左对齐

这样就很容易得到一个整数的十六进制字符串,但是当我们打印十六进制内容时,我们通常希望采用左边补0的等宽格式。 那么我们应该做什么呢? 很简单,只要在表示宽度的数字前面加一个0就可以了。

(s,“X”,4567); //产生:“”

上面使用“%d”的十进制打印也可以使用这种左边补0的方法。

这里需要注意一个符号扩展问题:例如,如果我们想打印短整数

(4) (short)-1 的内存十六进制表示。 在Win32平台上,一个short类型占用2个字节,所以我们自然要使用4个十六进制数来打印它:

短 si = -1;

(s,“X”,si);

”,这是怎么回事?因为是可变参数函数,除了前两个参数外,后面的参数都不是类型安全的,函数没有办法在函数调用之前仅仅通过一个“%X”就知道这些参数" 入栈时,是4字节整数还是2字节短整型?因此采用统一4字节处理方式,导致入栈时参数被符号扩展,扩展为32位。整数-1,打印时4个位置不够,所以把32位整数-1的8个十六进制数字全部打印出来。如果你想看到si的真面目,那么你应该让编译器做0扩展代替符号扩展(扩展时,二进制补码左边为0而不是符号位):

(s,“X”,(短)si);

就是这样。 或者:

短 si = -1;

(s,“X”,si);

您还可以使用“%o”以八进制格式打印整数字符串。 注意,八进制和十六进制都不会打印出负数,它们都是无符号的。 事实上,变量的内部编码是直接用十六进制或八进制表示的。

参考:

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码