永发信息网

sprintf()函数的用法

答案:4  悬赏:30  手机版
解决时间 2021-03-25 23:01
sprintf()函数的用法
最佳答案
函数简介:是一个函数,其函数功能是将数据格式化输出到字符串。sprintf()函数对于格式化string中的格式化的字符的有效性进行了检查,sprintf_s也携带着接收格式化字符串的缓冲区的大小。sprintf()函数将格式化字符串存到缓冲区,如果格式化字符串过大,则sprintf()会返回一个空string和设置无效参数句柄为激活。
函数功能:把格式化的数据写入某个字符串
函数原型:int sprintf( char *buffer, const char *format [, argument] … );
返回值:字符串长度(strlen)

例子:
char* who = "I";
char* whom = "CSDN";
sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. " 这字符串写到s中

sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
全部回答
sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串:
函数功能:把格式化的数据写入某个字符串
函数原型:int sprintf( char *buffer, const char *format [, argument] … );
返回值:字符串长度(strlen)
例子:
char* who = "I";
char* whom = "CSDN";
sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. " 这字符串写到s中
sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
sprintf函数的格式:int sprintf( char *buffer, const char *format [, argument,...] );
除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串
常用方式
sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中了,看个例子就明白了:
例:将”test 1 2”写入数组s中
#includeint main(int argc, char *avgv[])
{
char s[40]; sprintf(s,"%s%d%c","test",1,'2');
printf("%s%d%c","test",1,'2'); return 0;
}12345678910
编译:
g++ sprinftest.cpp -o sprinftest && ./sprinftest
输出结果:
sprintftest12
sprintftest12
2.若”%s”等输出符在字符串中
例:补全字符串str的缺省内容
#include #include #include int main(int argc, char *avgv[])
{ char str[] = "hel%co wo%sd! sp%stf test%d"; char buf[strlen(str)]; sprintf(buf, str, 'l', "rl", "rin", 1); std::cout << "str = "<< buf << "\nlen = " << strlen(buf) << std::endl; return 0;
}12345678910
sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕。

sprintf的第一个参数是目的字符串,如果不指定这个参数,执行过程中出现 "该程序产生非法操作,即将被关闭...."的提示。
因为C语言在进行字符串操作时不检查字符串的空间是否够大,所以可能会出现数组越界而导致程序崩溃的问题。
即使碰巧,程序没有出错,也不要这么用,因为早晚会出错。所以一定要在调用sprintf之前分配足够大的空间给buf。
sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终
函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串:

格式化数字字符串

sprintf 最常见的应用之一是把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa。如:
1>把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
2>可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
3>当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
4>也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐
这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。
sprintf(s, "%08X", 4567); //产生:"000011D7"
使用sprintf 的常见问题
sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。
1>>缓冲区溢出
第一个参数的长度太短了,没的说,给个大点的地方吧。当然也可能是后面的参数的问题,建议变参对应一定要细心,而打印字符串时,尽量使用”%.ns”的形式指定最大字符数。
2>>忘记了第一个参数
低级得不能再低级问题,用printf 用得太惯了。
3>>变参对应出问题
通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤其是对应”*”的那些参数,都提供了吗?不要把一个整数对应一个”%s”。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
大荔现在哪个楼盘好一些,大家推荐一下
如何使用Javascript获取距今n天前的日期
惠济路一段/G321(旧)(路口)我想知道这个在什
请问 thinkpad x240 与 t440s哪一款更划算?
中国的歼20为什么不
LOL沙皇皮肤哪个好 星际之门和幽冥领主阿兹尔
执行听证是什么?
如何实现清水混凝土的隔热保温操作
一1一(一2)+丨一2一3丨一5=?
21000平方米等于多少公顷?
t℃时,有一杯接近饱和的硝酸钾溶液,下列做
工商电话银行密码输错三次会被锁吗
亚当兰伯特20130519在今晚80后脱口秀上唱的歌
产品信息发布之后能被百度收录吗
广西鸿塑科技有限公司地址在哪,我要去那里办
推荐资讯
邹城六中老师哪个好
这种地暖阀门怎么打开啊
一个山下面一个昆是什么字
滨海宠物店在哪里?
我车安装的一键启动熄火的时候油泵响是什么原
SONY vgn p25g多少钱
太棒了用英语怎么读
中诚不锈钢地址在什么地方,想过去办事
读右面四幅图,回答18~19题。 18.小题1:右
五菱兴旺09年28万公里0.97排量多少钱
小混混们的群号,还有他们的QQ号,我怎么才能
洛奇这游戏好玩吗?是个老游戏了?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?