首页 > stdio.h不是标准库吗,为什么windows和linux下的函数不同?

stdio.h不是标准库吗,为什么windows和linux下的函数不同?

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 问题

于是就不太明白了


首先感谢各位的解答,解决了我的疑惑。
其次补充一下,windows下用的是vs2008,使用的是cpp
最后总结了一下,不知道理解的对不对

要判断是否支持一个函数以及判断该函数的特性

  1. 确定标准的版本。

  2. 确定编译器对标准的支持程度。

所以,实际上是说,标准在或者不在,编译器支持哪里,全凭开发者随意= =
最后引用一句话

至于 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这个函数的。既然没规定,那各编译器就自己搞自己的了。

【热门文章】
【热门文章】