user-0 提问: strcpy_s ,strcat_s 微软提出的所谓的CRT安全函数有没有MAC版本 或 Linux版本？ 有没有人实现过？

回复:
user: user-1
content: 引用 楼主 mcf330 的回复:strcpy_s ,strcat_s 微软提出的所谓的CRT安全函数有没有MAC版本 或 Linux版本？ 有没有人实现过？ 尽量不要让函数来做一些隐藏工作，因为你是C程序员。 在我看来 名符其实的字符串就用str族函数，不是就用mem系列。

user: user-2
content: 楼上所言极是。安全版本并不见得就一定安全，碰上烂水平的程序员，安全版本也没用。如果你自己足够的熟练，普通的函数就能满足要求了。这些带 _s 的版本应该是只有 MSVC 有的，其他的编译期不一定提供。

user: user-3
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strcpy_s.c /*** *strcpy_s.c - contains strcpy_s() * *   Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *   strcpy_s() copies one string onto another. * *******************************************************************************/  #include <string.h> #include <internal_securecrt.h>  #define _FUNC_PROLOGUE #define _FUNC_NAME strcpy_s #define _CHAR char #define _DEST _Dst #define _SIZE _SizeInBytes #define _SRC _Src  #include <tcscpy_s.inl>  C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\tcscpy_s.inl /*** *tcscpy_s.inl - general implementation of _tcscpy_s * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       This file contains the general algorithm for strcpy_s and its variants. * ****/  _FUNC_PROLOGUE errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC) {     _CHAR *p;     size_t available;      /* validation section */     _VALIDATE_STRING(_DEST, _SIZE);     _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE);      p = _DEST;     available = _SIZE;     while ((*p++ = *_SRC++) != 0 && --available > 0)     {     }      if (available == 0)     {         _RESET_STRING(_DEST, _SIZE);         _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);     }     _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);     _RETURN_NO_ERROR; }   C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strcat_s.c /*** *strcat_s.c - contains strcat_s() * *   Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *   strcat_s() concatenates (appends) a copy of the source string to the *   end of the destination string. * *******************************************************************************/  #include <string.h> #include <internal_securecrt.h>  #define _FUNC_PROLOGUE #define _FUNC_NAME strcat_s #define _CHAR char #define _DEST _Dst #define _SIZE _SizeInBytes #define _SRC _Src  #include <tcscat_s.inl>  C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\tcscat_s.inl/*** *tcscat_s.inl - general implementation of _tcscpy_s * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       This file contains the general algorithm for strcat_s and its variants. * ****/  _FUNC_PROLOGUE errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC) {     _CHAR *p;     size_t available;      /* validation section */     _VALIDATE_STRING(_DEST, _SIZE);     _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE);      p = _DEST;     available = _SIZE;     while (available > 0 && *p != 0)     {         p++;         available--;     }      if (available == 0)     {         _RESET_STRING(_DEST, _SIZE);         _RETURN_DEST_NOT_NULL_TERMINATED(_DEST, _SIZE);     }      while ((*p++ = *_SRC++) != 0 && --available > 0)     {     }      if (available == 0)     {         _RESET_STRING(_DEST, _SIZE);         _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);     }     _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);     _RETURN_NO_ERROR; }

user: user-4
content: linux下有strncpy 不能过于依赖这些函数，还是要自己把长度算清楚才好，否则程序执行结果就不是你想要的