微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

试图在 vsc 中使用 strcpy_s?

如何解决试图在 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_tstrcpy_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 举报,一经查实,本站将立刻删除。