sprintf和snprintf函数
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()的用法及区别,
- #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!
转载链接:http://blog.csdn.net/czxyhll/article/details/7950247
sprintf和snprintf函数的更多相关文章
- 【C语言天天练(十三)】printf、fprintf、sprintf和snprintf函数
#include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream, const char * ...
- Linux C 字符串函数 sprintf()、snprintf() 详解
一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...
- [C/C++基础] C语言常用函数sprintf和snprintf的使用方法
Sprintf 函数声明:int sprintf(char *buffer, const char *format [, argument1, argument2, …]) 用途:将一段数据写入以地址 ...
- [misc]printf/fprintf/sprintf/snprintf函数
转自:http://blog.csdn.net/To_Be_IT_1/article/details/32179549 需要包含的头文件 #include <stdio.h> int pr ...
- [转载]Linux C 字符串函数 sprintf()、snprintf() 详解
一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...
- C语言snprintf函数
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...
- 转:sprintf与snprintf
sprintf与snprintf int sprintf( char *buffer, const char *format [, argument] ... ); 除了前两个参数类型固定外,后面 ...
- printf、fprintf、sprintf和snprintf 区别
都是把格式好的字符串输出,只是输出的目标不一样: 1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向). 2 sprintf,是把格式字符串输出到指定字符串中,所以参数比print ...
- C语言sprintf与sscanf函数
1.前言 我们经常涉及到数字与字符串之间的转换,例如将32位无符号整数的ip地址转换为点分十进制的ip地址字符串,或者反过来.从给定的字符串中提取相关内容,例如给定一个地址:http://www.bo ...
随机推荐
- Spring Boot demo系列(六):HTTPS
2021.2.24 更新 1 概述 本文演示了如何给Spring Boot应用加上HTTPS的过程. 2 证书 虽然证书能自己生成,使用JDK自带的keytool即可,但是生产环境是不可能使用自己生成 ...
- (十二)docker --privileged
1. privileged参数作用 --privileged Give extended privileges to this container 大约在0.6版,privileged被引入docke ...
- 你好,FFMPEG 可视化
你好,FFMPEG 可视化 给大家看看我现在的玩具: 它有哪些功能呢?如你所见,不止于此 1. 视频录制 暂时只能录制视频,音频无法录制 FFMPEG.exe 暂时只支持视频,音频录制需要下载额外的工 ...
- 【动态数据源切换失败】由于事务@Transactional注解导致动态数据源切换失效的问题
不多BB,直接上代码: public class DataSourceKey { /** * 用户数据源 */ public final static String USER = "user ...
- C实现十进制与十六进制转换
include <stdio.h> include <stdlib.h> include <string.h> include <locale.h> i ...
- 基于防火墙的VRRP技术--华为防火墙双机热备--VGMP
目录 主备备份双机热备配置 负载分担双机热备配置 为了解决多个VRRP备份组状态不一致的问题,华为防火墙引入VGMP(VRRP Group Management Protocol)来实现对VRRP备份 ...
- hdu4370 比较抽象的最短路
题意: 给你一个n*n的矩阵,然后让咱们构造另一个n*n的矩阵,构造的矩阵有如下要求, 1.X12+X13+...X1n=1. 2.X1n+X2n+...Xn-1n=1. 3.for ea ...
- 还在一个模块打天下嘛?你知道引入Jetpack架构后,你的App会发生哪些奇妙的变化吗?
前言 上篇文章我给大家分享了我对Android架构的理解,从思想层面去讲述架构的演进过程.很多小伙伴读完后拍手叫好,表示还想听我讲一下对Jetpack 架构的看法,本着帮人帮到底的精神,今天我将再次动 ...
- ERROR: Pool overlaps with other one on this address space
出现问题 配置了两个不同的docker-compose.yml,使用了相同的网段,导致了在运行第二个yml文件时命令行报错目标网段已存在,报错如下: Creating network "v2 ...
- dispatcherServlet-servlet.xml(SSM maven 项目)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...