Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115240
  • 博文数量: 42
  • 博客积分: 916
  • 博客等级: 准尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-16 10:01
文章分类

全部博文(42)

文章存档

2011年(42)

分类: C/C++

2011-07-28 09:41:46

snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。
在gcc中,该函数名称就snprintf,而在VC中称为_snprintf。
  由于不是标准函数,没有一个统一的标准来规定该函数的行为,所以导致了各厂商间的实现版本可
能会有差异。今天也的的确确看到了差异,因为这个小小的差异是我的程序无法正常的处理数据。
  这个小小的差异发生在count参数。在VC中,这个count就是要写入的总字符串字符数,例如:
    
//VC
int main(int argc, char * argv[])
{
    char   buff[100];
     printf("%d ",_snprintf(buff,10,"1234567890ab"));
     printf("%s",buff);
    return 0;
}

//Linxu:gcc/g++
#include
int main(int argc, char * argv[])
{
    char   buff[100];
     printf("%d ",snprintf(buff,10,"1234567890ab"));
     printf("%s",buff);
    return 0;
}

 vc程序的输出是:
 -1
 1234567890@
gcc程序的输出是:
 12
 123456789
从输出结果可以知道:VC中的_snprintf的count参数表示,会向buff中写入count个字符,不包括'/0'字符,
并且不会在字符串末尾添加'/0'符,并且,如果字符串超过count,函数返回-1以标志可能导致的错误;gcc
中的snprintf函数的count参数表示,向buff中写入10个字符,包括'/0'字符,并且,返回实际的字符串长度,
例子中为12。

  如果不了解这些函数在各平台间的差异,也许我们的程序在移植过程中会变得很脆弱。我们应该小心各种各样
的陷阱
阅读(9038) | 评论(0) | 转发(0) |
0

上一篇:linux putty

下一篇:memset小记

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