1 问题描述(snprintf为例)
1.1 linux下
char test[4] = {0};
snprintf(test, 4, "%s", "hello");
test的内容将成为 hel\0
1.2 windows下
首先,没有snprintf这个函数,使用_snprintf替代吧
char test[4] = {0};
_snprintf(test, 4, "%s", "hello");
但是test的内容却是 hell
2 问题
于是就不太明白了
stdio.h不是c语言的标准输入输出库吗?为什么还和平台有关呢,或者说其实和编译器有关?
除了snprintf还有其他函数不同吗?
写过跨平台的大牛们,是如何解决这个问题的?
首先感谢各位的解答,解决了我的疑惑。
其次补充一下,windows下用的是vs2008,使用的是cpp
最后总结了一下,不知道理解的对不对
要判断是否支持一个函数以及判断该函数的特性
确定标准的版本。
确定编译器对标准的支持程度。
所以,实际上是说,标准在或者不在,编译器支持哪里,全凭开发者随意= =
最后引用一句话
至于 Visual C++ 不支持 C99 ,那因为它是个 C++ 编译器,而 C++ 编译器确实没有支持 C99 的义务,这完全合理。
来自为什么 C99 标准都推出很长时间了,真正能够完全支持 C99 的编译器却比较少?
snprintf
的确是标准库的内容,但是是c99增加的,你看看是不是你的编译器太老而不支持c99。
反正我在vs2015里面查看是有的。
简单来说,虽然都是“标准库”,但windows遵循的标准跟Linux/Unix遵循的标准不完全一样。Linux/Unix一般遵循POSIX/SUSv3等标准,而windows有自己一套标准,所以需要仔细查看各自平台上的文档说明,区别对待。就你这个代码来说,就很好地体现了两个平台上对类似功能的不同处理:在Linux上,snprintf的行为是“最多复制参数指定的那么多个字节(包括结束的'\0')”,而Windows上的_snprintf是不把结束的'\0'计算在内的。这些在man/msdn中都有说明。
如果真的是标准库规定的函数,那编译器的实现肯定要遵循规定的。
你的问题是,在c99以下的c语言里,标准库是没有规定有snprintf这个函数的。既然没规定,那各编译器就自己搞自己的了。