2.C语言基础-sprintf函数用法

article/2025/10/8 4:30:34

theme: juejin
highlight: school-book

1.前言

当需要在控制台打印字符串的时候,会用到printf函数,printf会将格式化后的字符串打印在控制台上,如果需要将数字或者其他数据格式化成字符串保存到一个字符串变量中,会调用另一个函数sprintf

2.语法

函数声明为:

int sprintf(char *string, char *format [,argument,...]);
  • string:这是一个指向字符数组的指针,用来存储c字符串
  • format:需要格式化的字符串,它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier
  • argument:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
  • 返回值:如果成功,则返回写入的字符总数,失败了则返回负数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5

需要注意的点:
format指向的字符串从string[0]的位置依次覆盖,当format指向的字符串比string小时,string数组中未被覆盖的值将保持,当format指向的字符串比string大时,会报内存错误

例子:

2.1 format指向的字符串比string小

#pragma warning(disable:4996)#include <stdio.h>
#include <string.h>int main()
{int i = 0;char string[5] = { 'I','L','O','V','E'};/*  Write C code in this online editor and run it. */sprintf(string, "H%s","I");for (i = 0; i < 5; i++){printf("string[%d]=%c\n",i,string[i]);}return 0;
}

输出结果:

string[0]=H
string[1]=I
string[2]=
string[3]=V
string[4]=E

string[2]=打印为空是因为格式化字符串之后会自动在字符串后面添加\0,所以我们在使用sprintf函数之前,一定要对string进行memset操作,保证目标字符串被清除干净

memset(string,0,sizeof(char) * 5)

2.1 format指向的字符串比string大

#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>int main()
{char string[5] = { 0 };memset(string, 0, sizeof(char) * 5);/*  Write C code in this online editor and run it. */sprintf(string, "Hello, World!%s \n","who i am");return 0;
}

结果:在VS2019下报错

Run-Time Check Failure #2 - Stack around the variable 'string' was corrupted.

#pragma warning(disable:4996)的原因是允许IDE使用这种容易产生漏洞的旧函数

3.具体示例

3.1 格式化整数

将整数打印成字符串保存在string中

sprintf(string, "%d",123);

指定宽度,设置左右对齐方式

"%m%d":m为正值,右边对齐,左边不足的空格代替m为负值,左边对齐,右边不足的以空格代替

举例:

#pragma warning(disable:4996)#include <stdio.h>
#include <string.h>int main()
{int i = 0;char string[17];//注意加上`\0`/*  Write C code in this online editor and run it. */sprintf(string, "%8d%8d",456,789);printf("string=%s\n", string);sprintf(string, "%-8d%-8d", 456, 789);printf("string=%s", string);return 0;
}

结果:

image.png

3.2 打印浮点数

使用格式符%f时,默认保持小数点后面6位数,如

sprintf(string, "%f",3.1415626);//3.141593

控制打印的浮点数的宽度和小数位数,格式位%a.bf其中a表示打印宽度b表示小数位数,如:

#pragma warning(disable:4996)#include <stdio.h>
#include <string.h>int main()
{int i = 0;char string[17];//注意加上`\0`/*  Write C code in this online editor and run it. */sprintf(string, "%f",3.1415926);printf("string=%s\n", string);sprintf(string, "%5.3f", 3.1415926);printf("string=%s\n", string);sprintf(string, "%-5.3f", 3.1415926);printf("string=%s\n", string);sprintf(string, "%.3f", 3.1415926);printf("string=%s\n", string);return 0;
}

结果:

string=3.141593
string=3.142
string=3.142
string=3.14

3.3 字符串连接

使用sprintf可以一次性连接多个字符串,如·

#pragma warning(disable:4996)#include <stdio.h>
#include <string.h>int main()
{int i = 0;char string[17];//注意加上`\0`char* name = "Tom";char* base = "Asia";/*  Write C code in this online editor and run it. */sprintf(string,"%s live in %s",name,base);printf("%s", string);return 0;
}

结果:

Tom live in Asia

http://chatgpt.dhexx.cn/article/nE2oJfyH.shtml

相关文章

linux fprintf sprintf 函数

目录 前言fprintf 函数sprintf 函数 前言 <fgets gets fputs puts 函数> 前面验证了fgets fputs gets puts 是否把新行符存入缓存的结论 并且都得出了结果。 这次继续验证 fprintf sprintf 是否是行缓存&#xff1f;&#xff1f;fprintf 函数 先用之前的方法试试 输出…

sprintf函数的用法linux,Linux 常用函数——sprintf函数

Linux 常用函数——sprintf函数 (2011-04-06 20:30:44) sprintf&#xff1a;由于sprintf 跟printf 在用法上几乎一样&#xff0c;只是打印的目的地不同而已&#xff0c;前者打印到字符串中&#xff0c;后者则直接在命令行上输出。 sprintf 是个变参函数&#xff0c;定义如下&am…

sprintf函数的用法

前言&#xff1a; sprintf函数调用的主要用途就是把一个字符串放在一个已知的字符数组里去。其实这是一个很常用的库函数&#xff0c;在解决某些OJ题的时候会经常用到它来帮助实现字符串的转移和储存。这里我就在简单的介绍一下其用法。 sprintf函数结构&#xff1a; 首先需要…

sprintf 函数详解

printf函数大家都熟悉&#xff0c;但是printf一般打印到标准输出&#xff0c;在需要整理、格式化字符串时&#xff0c;sprintf就大显身手了。 例如&#xff0c;在处理传感器数据时&#xff0c;为了将得到的数据整合成特定的格式通过网络发送出去&#xff0c; char buffer[100…

vs2019:constexpr 函数“qCountLeadingZeroBits”不能生成常量表达式

打开vs属性页&#xff0c;在常规中修改目标平台版本为8.1&#xff0c;修改平台工具集为vs2015

[C++11]常量表达式函数

constexpr修饰函数。 普通函数/类成员函数。 1.函数必须要有返回值&#xff0c;并且return返回的表达式必须是常量表达式。 代码如下: #include <iostream> using namespace std;//error 不是常量表达式函数 constexpr void func1() {int a 200;cout << a &l…

C++语言编程概念:常量、常量表达式和常量初始化

常量 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面值。常量可以是任何的基本数据类型&#xff0c;可分为整型数字、浮点数字、字符、字符串和布尔值。常量就像是常规的变量&#xff0c;只不过常量的值在定义后不能进行修改。 时期不同…

c语言 case常量表达式,在switch语句中,每一个case的常量表达式的值必须互不相同。()...

值必不属特性真正质量的是以下于手机的。 《安八十条规全生》第定产法&#xff0c;句中构成的犯罪&#xff0c;2万)万投资下的对个人经人处罚款营的元以元以上(&#xff0c;刑事追究责任够刑罚的依法尚不事处。 密集安部他特型的国务规定的大人员和其场所程院公殊建设工&#x…

‘this’不能用于常量表达式错误(C++)【问题解决】

目录 一、报错问题 1、代码 test.h test.cpp 2、问题描述 二、网上解决思路 三、解决方案 【元旦快乐&#x1f339;&#xff0c;新年快乐&#x1f389;】 最近在编译程序时出现了“ ‘this’不能用于常量表达式错误(C )”的报错问题&#xff0c;查阅多位博主写的文章后&…

error C2057: 应输入常量表达式

提示编译源文件 src\osipparser2\osip_port.c文件出现了问题&#xff0c;找了半天在下图源文件里找到了问题。这提示也是醉了。 解决&#xff1a;修改冲突名称CR为其他名称。 跟osip_port.c没有关系啊&#xff0c;可能是头文件引用导致的吧。

java 常量表达式_JavaSwitch语句:常量表达式是必需的,但它是常量

万千封印 我知道编译器需要在编译时知道表达式才能编译一个开关&#xff0c;但是为什么foo.ba_常数不是呢&#xff1f;虽然从字段初始化后执行的任何代码的角度来看&#xff0c;它们都是常量&#xff0c;但它们不是编译时间常数在JLS所要求的意义上&#xff1b;见15.28常量表达…

C++知识整理系列(三)—— constexpr常量表达式

const修饰常量&#xff0c;但是const并未区分编译时常量和运行时常量&#xff0c;而constexpr则只能是编译时常量&#xff0c;在C11中提出。这篇文章&#xff0c;将详细讲解constexpr。 目录 一、常量表达式二、constexpr变量三、constexpr函数四、字面值类型 五、指针和conste…

C语言中的问号表达式

这道题目中的w<x?w:z<y?z:x 可以写为&#xff1a;w<x?w:(z<y?z:x) 首先z<y真的所以根据口诀真前假后得**(z<y?z:x)z1** 又因为w<x为假&#xff0c;所以得整个表达式为&#xff1a;1

正则表达式-问号(?)的用法

世界上并没有完美的程序&#xff0c;但是我们并不因此而沮丧&#xff0c;因为写程序就是一个不断追求完美的过程。 关于正则表达式&#xff0c;语法简单&#xff0c;但是要完成一个自己想要的逻辑判断就不那么容易了&#xff0c;今天主要讲解问号的一种用法&#xff0c;大家都知…

TypeScript 中问号+点 (?.) 和双问号 (??) 的含义

问号点表达式 (可选链操作符&#xff1a;?.) 例如 let res obj?.arr?.length 等价于 let res obj && obj.arr && obj.arr.length 如果不加问号&#xff0c;光是 obj.arr.length&#xff0c;可能报错没有 length 这个属性&#xff0c;如图&#xff1a; 因…

正则表达式中问号的用法

1、需求背景 由于最近工作需要&#xff0c;要从网页链接中找到网页中有用的博客内容&#xff0c;大家都知道&#xff0c;基本使用正则表达式来匹配是最简单的一种做法&#xff0c;而一般都是div中有div&#xff0c;怎么才能匹配到那些内容的div而不是一直匹配到最后面的div呢?…

问号表达式与逗号表达式问题

问号表达式&#xff1a; #include<stdio.h> void main() {int a,b,c,d,e;c9;d8;scanf("%d,%d",&a,&b);e(a>b)?c:d;printf("%d\n",e); } 可以理解为&#xff0c;如果a>b则ec&#xff0c;否则ed。“”后整体表达式可以看做&#xff08…

JavaScript 中问号的三种用法 ??和?.以及?: 您知道吗?

最近看了一些关于JavaScript的测试脚本&#xff0c;觉得JS 中问号的用法还是蛮有意思的&#xff0c;于是做了一下总结&#xff0c;在这里分享给大家&#xff01;JS中的问号大概有三种用法&#xff0c;分别是&#xff1a;空值合并操作符、可选链操作符和三目运算。 问号问号&…

实验6:shell编程

实验目的 &#xff08;1&#xff09;掌握shell编程的变量、程序控制结构、条件测试等语法。 &#xff08;2&#xff09;了解shell 脚本的运行方式 &#xff08;3&#xff09;理解shell脚本中的函数 &#xff08;4&#xff09;掌握简单shell脚本编写方法实验环境 &#xff08;1&…

shell编程练习题

近来学习到linux的shell编程一块&#xff0c;于是学完后想练习一下。本文就是基于一道练习题来记录一下自己遇到的问题以及解决的过程。 首先看题目&#xff1a;编写shell脚本&#xff0c;要求实现如下功能&#xff1a;当执行一个程序的时候&#xff0c;这个程序会让使用者选择…