首页 > 试题广场 >

sprinf和snprintf函数区别是()。

[问答题]
sprinf和snprintf函数区别是。
sprinf()函数类似于snprintf().不同之处是sprintf()不需要使用参数来限制“可以被写入目的缓冲区的字符”个数,这样,使用时存在缓冲区上溢的风险,特别是输出的长度会受到目前地域和输入变量的影响。使用snprintf()比较安全
发表于 2015-01-19 21:18:03 回复(0)
更多回答
推荐
函数原型为:
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
snprintf中的size用来限定str可用空间的大小,防止str的内存越界。
编辑于 2015-01-27 20:29:03 回复(0)
答案:
sprintf() 格式化输出函数
功能: 函数sprintf()用来作格式化的输出。
用法: 此函数调用方式为int sprintf(char *string,char *format,arg_list);
说 明: 函数sprintf()的用法和printf()函数一样,只是sprintf()函数给出第一个参数string(一般为字符数组),然后再调用 outtextxy()函数将串里的字符显示在屏幕上。arg_list为参数表,可有不定个数。通常在绘图方式下输出数字时可调用sprintf()函 数将所要输出的格式送到第一个参数,然后显示输出。
用 法: int sprintf(char *string, char *farmat [,argument,...]);
snprintf()是sprintf()的限制字符数量的一个表达
功能:将可变个参数(...)按照format格式化成字符串,然后将其复制到str中
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为格式化后的字符串的长度。
发表于 2015-01-28 15:03:24 回复(0)
#include <iostream>
using namespace std;
int main()
{
    char *p1="China";
    printf("%s\n",p1); // China
    char  a[20];
    char  b[20];
/*三个打印函数printf()/sprintf()/snprintf()区别
printf( const char *format, ...)    格式化输出字符串,默认输出到终端-----stdout
sprintf(char *dest, const char *format, ...)  格式化输出字符串到指定的缓冲区
snprintf(char *dest, size_t size,const char *format, ...)  按指定的SIZE格式化输出字符串到指定的缓冲区
*/
    sprintf(a,"%s",p1); // 把p1字符串拷贝到数组a中('\0'也拷贝过去了)
    printf("%s\n",a); // China
    cout << sizeof(a) << endl; // 20
    memset(a,0,sizeof(a));
    // void *memset(void *s, int ch, size_t n);
    // 函数解释:将s中当前位置后面的n个字节用ch替换并返回s 
    _snprintf(a,3,"%s",p1); // 拷贝P1中前3个字符到数组a中,并在末尾自动添加'\0'
    printf("%s\n",a); // Chi
    printf("%d\n",strlen(a)); // 3

    memset(b,0,sizeof(b));
    _snprintf(b,4,"%s",p1); // 拷贝P1中前4个字符到数组b中,并在末尾自动添加'\0'
    printf("%s\n",b); // Chin
    printf("%d\n",strlen(b)); // 4
    return 0;
}

发表于 2018-07-05 17:12:48 回复(0)
sprintf可能导致缓冲区溢出问题而不被推荐使用,所以在项目中我一直优先选择使用snprintf函数,虽然会稍微麻烦那么一点点。这里就是sprintf和snprintf最主要的区别:snprintf通过提供缓冲区的可用大小传入参数来保证缓冲区的不溢出,如果超出缓冲区大小则进行截断。但是对于snprintf函数,还有一些细微的差别需要注意。
发表于 2021-09-22 16:22:24 回复(0)
两者都是把源串拷入目标串,但是后者可以限定拷入的个数,若成功就返回源串的长度,否则返回负值,而且拷贝时会在最后一位加'\0',后者更安全
发表于 2015-06-11 22:11:42 回复(0)
snprintf()是sprintf()的限制字符数量的一个表达
发表于 2015-01-11 16:49:06 回复(0)