解决方案

sprintf()函数的用法

seo靠我 2023-09-24 09:10:22

sprintf函数的格式:int sprintf( char *buffer, const char *format [, argument,...] );

除了前两个参数固定外,可选参数可以是任意个。SEO靠我buffer是字符数组名;format是格式化字符串

常用方式

sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中了,看个例子就明白了:

例:将”test 1 2”写SEO靠我入数组s中

#includeint main(int argc, char *avgv[])

{

char s[40]; sprintf(s,"%s%d%c","test",1,2); /*第一个参数就是指SEO靠我向要写入的那个字符串的指针,剩下的就和printf()一样了

你可以比较一下,这是向屏幕输入*/

printf("%s%d%c","test",1,2); return 0;

}12345678910

编译:SEO靠我

g++ sprinftest.cpp -o sprinftest && ./sprinftest

输出结果:

sprintftest12

sprintftest12

2.若”%s”等输出符在字符串中

例:补全字SEO靠我符串str的缺省内容

#include #include #include int main(int argc, char *avgv[])

{ char str[] = "hel%co wo%sd! sp%sSEO靠我tf test%d"; char buf[strlen(str)]; sprintf(buf, str, l, "rl", "rin", 1); std::cout << "str = "<< bufSEO靠我 << "\nlen = " << strlen(buf) << std::endl; return 0;

}123456789101112

编译:

g++ sprinftest.cpp -o sprinfSEO靠我test && ./sprinftest

输出结果:

str = hello world! sprintf test1

len = 27

这种形式也可以将多个字符值或字符串值赋值到字符串str中,有多少个输出SEO靠我符就后面就加多少个参数。

 本回答被网友采纳

 1  

 评论 

分享

 举报

冰丽荔 

来自百度知道认证团队 2018-05-19

sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字SEO靠我符串输出到屏幕。

sprintf的第一个参数是目的字符串,如果不指定这个参数,执行过程中出现 "该程序产生非法操作,即将被关闭...."的提示。

因为C语言在进行字符串操作时不检查字符串的空间是否够大,所SEO靠我以可能会出现数组越界而导致程序崩溃的问题。

即使碰巧,程序没有出错,也不要这么用,因为早晚会出错。所以一定要在调用sprintf之前分配足够大的空间给buf。

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

inSEO靠我t sprintf( char *buffer, const char *format [, argument] ... );

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

printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后SEO靠我边的变参列表中提供相应的变量,最终

函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串:

格式化数字字符串

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

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

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

2>可以指定宽度,不足的左边补空格:

sprintf(s,SEO靠我 "%8d%8d", 123, 4567); //产生:" 123 4567"

3>当然也可以左对齐:

sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"

4SEO靠我>也可以按照16 进制打印:

sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐

sprintf(s, "%-8X", 4568); //大写16 进制,宽度占SEO靠我8 个位置,左对齐

这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。

sprintSEO靠我f(s, "%08X", 4567); //产生:"000011D7"

使用sprintf 的常见问题

sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,SEO靠我但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。

1>>缓冲区溢出

第一个参数的长度太短了,没的说,给个大点的地方吧。当然也SEO靠我可能是后面的参数的问题,建议变参对应一定要细心,而打印字符串时,尽量使用”%.ns”的形式指定最大字符数。

2>>忘记了第一个参数

低级得不能再低级问题,用printf 用得太惯了。

3>>变参对应出问题

SEO靠我常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤其是对应”*”的那些参数,都提供了吗?不要把一个整数对应一个”%s”。

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2