Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4230025
  • 博文数量: 447
  • 博客积分: 1241
  • 博客等级: 中尉
  • 技术积分: 5786
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-27 06:48
个人简介

读好书,交益友

文章分类

全部博文(447)

文章存档

2024年(1)

2023年(5)

2022年(29)

2021年(49)

2020年(16)

2019年(15)

2018年(23)

2017年(67)

2016年(42)

2015年(51)

2014年(57)

2013年(52)

2012年(35)

2011年(5)

分类: C/C++

2013-10-16 17:58:54

以前使用snprintf()不是一年两年了,以前经常写
snprintf(params->ipsubnet,IP_MASK,"%s/%d",g_sslvpnconfig.serverip,slash);
params->ipsubnet[IP_MASK-1]='\0';

最近在做nginx模块时发现了问题,snprintf格式化字符串时,自动少了一位。
man了一下,The functions snprintf() and vsnprintf() write at most size bytes (including the trailing null byte ('\0')) to str.
我记得vs2005,不会自动添加'\0'
#include
#include

int main (void)
{
    char buffer[2];

    snprintf(buffer, sizeof(buffer), "SomeString");

    return 0;
}
vs2010没有snprintf函数,提供了_snprintf,因为snprintf是c99的一部分,微软没有支持c99,转而支持c++11,snprintf是c++11的一部分。
#ifdef _MSC_VER

#define snprintf c99_snprintf

inline int c99_snprintf(char* str, size_t size, const char* format, ...)
{
    int count;
    va_list ap;

    va_start(ap, format);
    count = c99_vsnprintf(str, size, format, ap);
    va_end(ap);

    return count;
}

inline int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap)
{
    int count = -1;

    if (size != 0)
        count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
    if (count == -1)
        count = _vscprintf(format, ap);

    return count;
}

#endif // _MSC_VER

阅读(3865) | 评论(1) | 转发(1) |
0

上一篇:打开mysql远程连接

下一篇:nginx配置ssl

给主人留下些什么吧!~~

knull2014-01-04 15:48:33

linux下是会自动添加'\0'的;但是vs是不会的(_snprintf),我用的vs只有vs2005和vc6