一次移植,将windows下的某个程序移植到linux下,在运行测试阶段,发现存在部分字符丢失的问题,
查找原因,发现原来windows下的_snprintf与linux下的snprintf 存在一定的差异。
linux下 sprintf会自动在后面加'/0',同时copy的长度也包含了‘/0’;
snprintf的man中有如下解释:
The functions snprintf() and vsnprintf() do not write more than size bytes (including the
trailing '/0').
但windows下的_snprintf并未按照该规则,就是简单的copy指定长度的字符,不自动加0,并且长度也不包含0。
试验代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char buf[20];
char *pstr = "this is a test string";
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf)-1, "%s", pstr);
printf("buf = %s, strlen(buf) = %d/n", buf, strlen(buf));
return 0;
}
windows下的结果为 :
buf = this is a test stri, strlen(buf) = 19
linux下的结果为:(_snprintf 替换为 snprintf)
buf = this is a test str, strlen(buf) = 18
平台间函数的微妙差异必然很容易导致问题的发生,防不胜防啊。。。。