使用strcpy和strcat的C4496和C6387

时间:2019-12-24 11:02:01

标签: c

我正在尝试通过strlen()函数将函数中的2个字符串复制到新的动态内存中。

char* PairSortedArrays(char a[], char b[])
{
    char* p1 = (char*)malloc(strlen(a) + strlen(b) + 1);
    if(p1)
    {
    strcpy(p1, a);
    strcat(p1, b);
    }
    return p1;
}

获取编译器错误:

Severity    Code    Description Project File    Line    Suppression State
Error   C4996   'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.   check   C:\Users\97254\source\repos\check\check\Source.c    35  

3 个答案:

答案 0 :(得分:1)

请勿使用strcat,因为您拥有所有可用信息。

char *strdupcat(const char *str1, const char *str2)
{
    size_t str1Len;
    char *result = NULL;

    if(str1 && str2)
    {
        result = malloc((str1Len = strlen(str1)) + strlen(str2) + 1);
        if(result)
        {
            strcpy(result, str1);
            strcpy(result + str1Len, str2)
        }
    }
    return result;
}

答案 1 :(得分:1)

我不确定这是否是您实际问题的一部分,但strcpy()并不安全,并且可能导致缓冲区溢出。顺便说一句,您的编译器不应仅因为这个原因而无法编译。.但是基于microsoft post:

“不推荐使用某些C运行时库函数,因为它们不安全且具有更安全的变体。不推荐使用某些C运行时库函数,因为它们已过时。”

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?view=vs-2019

希望获得帮助。

答案 2 :(得分:0)

较旧的字符串函数(安全性较低的版本)被标记为不推荐使用,新版本的后缀为_s(“安全”)(示例:strcpy_s)。

就您而言,

“ strcpy” 函数无法告诉您要复制的源字符串是否太大,无法容纳其目标缓冲区。

但是在安全的“ strcpy_s” 中,将缓冲区的大小作为参数,因此它可以确定是否会发生缓冲区溢出。

示例:

如果使用strcpy_s将11个字符复制到10个字符的缓冲区中,那是您的错误; strcpy_s无法纠正您的错误,但可以检测到错误并通过调用无效的参数处理程序来通知您。

相关问题