欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

三个打印函数printf()/sprintf()/snprintf()区别

发布时间:2025/3/20 编程问答 77 豆豆
生活随笔 收集整理的这篇文章主要介绍了 三个打印函数printf()/sprintf()/snprintf()区别 小编觉得挺不错的,现在分享给大家,帮大家做个参考.


先贴上其函数原型
printf( const char *format, ...)    格式化输出字符串,默认输出到终端-----stdout
sprintf(char *dest, const char *format,...)     格式化输出字符串到指定的缓冲区
snprintf(char *dest, size_t size,const char *format,...)     按指定的SIZE格式化输出字符串到指定的缓冲区

printf()函数在这就不再讨论,这里主要讨论sprintf()与snprintf()的用法及区别,

[plain] view plaincopy
  • #include "stdafx.h"  
  • #include <stdio.h>  
  • using namespace std;  
  • int _tmain(int argc, _TCHAR* argv[])  
  • {  
  •     char *p1="China";  
  •     char  a[20];  
  •     sprintf(a,"%s",p1);  
  •     printf("%s\n",a);  
  •     memset(a,0,sizeof(a));  
  •     _snprintf(a,3,"%s",p1);  
  •     printf("%s\n",a);  
  •     printf("%d\n",strlen(a));  
  •         return 0;  
  • }  

  • 结果输出:
    China
    Chi
    3
    分析:
    sprintf(a,"%s",p1)  把p1字符串拷贝到数组a中('\0'也拷贝过去了)。
    snprintf(a,3,"%s",p1)  拷贝P1中前3个字符到数组a中,并在末尾自动添加'\0'。
    sprintf属于I/O库函数,snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。在gcc中,该函数名称就snprintf,而在VC中称为_snprintf。 如果你在VC中使用snprintf(),会提示此函数未声明,改成_snprintf()即可。

    注意点:
    1   sprintf是一个不安全函数,src串的长度应该小于dest缓冲区的大小,(如果src串的长度大于或等于dest缓冲区的大小,将会出现内存溢出。)
    2   snprintf中源串长度应该小于目标dest缓冲区的大小,且size等于目标dest缓冲区的大小。(如果源串长度大于或等于目标dest缓冲区的大小,且size等于目标dest缓冲区的大小,则只会拷贝目标dest缓冲区的大小减1个字符,后加'\0';该情况下,如果size大于目标dest缓冲区的大小则溢出。)
    3   snprintf ()函数返回值问题,   如果输出因为size的限制而被截断,返回值将是“如果有足够空间存储,所应能输出的字符数(不包括字符串结尾的'\0')”,这个值和size相等或者比size大!也就是说,如果可以写入的字符串是"0123456789ABCDEF"共16位,但是size限制了是10,这样 snprintf() 的返回值将会是16 而不是10!

    总结

    以上是生活随笔为你收集整理的三个打印函数printf()/sprintf()/snprintf()区别的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。