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 <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。 如果不了解这些函数在各平台间的差异,也许我们的程序在移植过程中会变得很脆弱。我们应该小心各种各样 的陷阱 |
|