2009年6月4日星期四

snprintf/_snprintf 在不同平台间函数差异

在VC和gcc中,strncpy调用形式一样。
char *strncpy(char *dest, const char *src, size_t n);
snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。
在gcc中,该函数名称就snprintf,而在VC中称为_snprintf。(赖半仙注:snprintf,strncpy几个安全字符串函数已经加入到C99标准里面
由于不是标准函数,没有一个统一的标准来规定该函数的行为,所以导致了各厂商间的实现版本可能会有差异。今天也的的确确看到了差异,因为这个小小的差异是我的程序无法正常的处理数据。
这个小小的差异发生在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 <stdio.h>
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。
  如果不了解这些函数在各平台间的差异,也许我们的程序在移植过程中会变得很脆弱。我们应该小心各种各样
的陷阱。

没有评论: