分享

sprintf和snprintf函数用法简介

 心不留意外尘 2016-09-08

http://blog.csdn.net/hr10707020217/article/details/20861795

2014

函数原型

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

参数列表

    bufferchar型指针,指向将要写入的字符串的缓冲区。

    format:格式化字符串。

    [argument]...:可选参数,可以是任何类型的数据。

    返回值:字符串长度(strlen

函数功能:

把格式化的数据写入某个字符串缓冲区

常见用法:

  1. int main( void)  
  2. {  
  3.    char  buffer[200], s[] = "computer",c = 'l';  
  4.    int   i = 35, j;  
  5.    floatfp = 1.7320534f;  
  6.    
  7.    //Format and print various data:  
  8.    j = sprintf( buffer,     "  String:    %s\n", s );// C4996  
  9.    j += sprintf( buffer + j, "   Character:%c\n", c ); // C4996  
  10.    j += sprintf( buffer + j, "  Integer:   %d\n", i );// C4996  
  11.    j += sprintf( buffer + j, "   Real:      %f\n", fp );// C4996  
  12.    //Note: sprintf is deprecated; consider using sprintf_s instead  
  13.    printf( "Output:\n%s\ncharactercount = %d\n", buffer, j );  
  14. }  

sprintf函数是一个变参函数,前两个函数有固定类型,会进行安全检查,后面的参数都不是类型安全的。使用的时要小心。还有一点就是sprintf() 的写操作可能会越过buffer的边界,从而产生一个缓冲区溢出。

要修正这一缺陷,可以使用函数snprintf()代替函数sprintf()。

函数原型

int snprintf(char *str, size_t size, const char *format, ...)

参数列表

    strchar型指针,指向将要写入的字符串的缓冲区。

    size要写入str缓冲区的长度。

    format格式化字符串

    [argument]...:可选参数,可以是任何类型的数据。

   返回值:字符串长度(strlen

函数功能:

最多从源串中拷贝n1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。

常见用法:

  1. int main()  
  2. {  
  3.    charstr[10] = {'0'};  
  4.    snprintf(str, sizeof(str), "%s",123);  
  5.    printf("%s\n",str);  
  6. }  

snprintf()函数并不是标准c/c++中规定的函数,所以在许多编译器中,厂商提供了其相应的实现的版本。在gcc中,该函数名称就snprintf(),而在VS中称为_snprintf所以在需要使用snprintf()时改成_snprintf就可以了,或则在预编译处加入:

#if _MSC_VER

#define snprintf _snprintf

#endif

上面这个例子有个错误:这是我在写的过程中的误理解,函数基本功能把格式化的数据存储在字符串中,但是我以为是字符串,所以在转化的时候都以“%s”,这里错了,是什么类型就以什么类型转换,比如float类型,就以“%f”转换。所以改为snprintf(str, sizeof(str), "%d",123);就正确了。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多