如何解决试图在 vsc 中使用 strcpy_s?
当我尝试运行代码时,我得到:
warning: implicit declaration of function 'strcpy_s' [-Wimplicit-function-declaration]
我包含了 string.h 和 stdio.h。
代码:
#include <string.h>
#include <stdio.h>
int main(void) {
static int foo = 0;
char s[12];
char *t = "01234567890123"
printf("foo %p\n s %p\n",&foo,s);
strcpy_s(s,11,t);
}
解决方法
strcpy_s()
不能在没有 __STDC_WANT_LIB_EXT1__
的情况下声明:
#define __STDC_WANT_LIB_EXT1__
#include <string.h>
如果实现未定义 __STDC_LIB_EXT1__
,则扩展在您的库中不可用。
由于您没有检查 errno_t
的 strcpy_s
返回值,因此最好使用支持更广泛的 strncpy()
。
strcpy_s()
(甚至 strncpy_s()
)的优点是它们会告诉您何时失败,并且成功保证目标是 NUL 终止。但是由于您没有检查错误,因此几乎没有优势。这可以通过明确确保 s[11]
为 NUL 来解决,例如:
零初始化:
char s[12] = {0} ;
或赋值:
s[sizeof(s) - 1] = '\0' ;
#include <string.h>
#include <stdio.h>
int main(void)
{
static int foo = 0;
char s[12] = {0} ;
char *t = "01234567890123"
printf("foo %p\n s %p\n",&foo,s);
strncpy(s,t,sizeof(s) - 1) ) ;
return 0 ;
}
请注意,在这种情况下,strncpy()
会将 11 个字符复制到 s
,并且不会写入 NUL 终止符。在这种情况下,我对整个数组进行了零初始化,但在不知道目的地为零初始化或长度变量的情况下,更安全的习惯用法是添加终止符:
strncpy(s,len ) ;
s[len] = '\0' ;
或者特别是在这个例子中:
strncpy(s,sizeof(s) - 1) ) ;
s[sizeof(s) - 1)] = '\0' ;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。