C4496和C6387用于使用strcpy和strcat

C4496和C6387用于使用strcpy和strcat,c,C,我试图通过strlen()函数将一个函数中的两个字符串复制到一个新的动态内存中 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

我试图通过strlen()函数将一个函数中的两个字符串复制到一个新的动态内存中

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  

不要使用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;
}


不要使用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;
}


我不确定这是否是实际问题的一部分,但strcpy()不安全,可能导致缓冲区溢出。顺便说一句,你的编译器不应该因为这个而编译失败。。但根据微软的一篇帖子:

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


希望有帮助。

我不确定这是否是您实际问题的一部分,但strcpy()不安全,可能会导致缓冲区溢出。顺便说一句,你的编译器不应该因为这个而编译失败。。但根据微软的一篇帖子:

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


希望有此帮助。

较旧的字符串函数、较不安全的版本被标记为已弃用,而新版本具有“安全”后缀(示例:strcpy)

就你而言

“strcpy”函数无法判断要复制的源字符串对于其目标缓冲区是否太大

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

示例:


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

较旧的字符串函数、较不安全的版本被标记为已弃用,而新版本具有_s(“安全”)后缀(示例:strcpy)

就你而言

“strcpy”函数无法判断要复制的源字符串对于其目标缓冲区是否太大

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

示例:


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

我有错误C4996和C6387您没有检查
malloc()的返回值。
i added if(p1)仍然有错误C4496您使用的编译器及其版本?检查错误。如果它可以解决您的问题。我有错误C4996和C6387您没有检查我添加的if(p1)的
malloc()的返回值,它仍然有错误C4496您正在使用哪个编译器及其版本?检查。如果它能解决你的问题。@TruthSeeker C有一个长期的、令人悲伤的、持续的缓冲区溢出历史。虽然有时您知道拷贝是安全的,但是像
strcpy
strcat
这样的函数通常都是在不确定的情况下使用的。它们很容易被误用,以至于人们认为它们的使用总是不好的。使用更安全的替代方案。哪个是更安全的替代方案?
memcpy
strcpy
更安全。在这种情况下,使用strlen并不重要,如果我们从未定位的内存中读取,该功能将失败。否则,即使是坏的srings,我们也会分配足够的内存strcpy@TruthSeekerC有一段很长的、令人悲伤的、持续不断的缓冲区溢出历史。虽然有时您知道拷贝是安全的,但是像
strcpy
strcat
这样的函数通常都是在不确定的情况下使用的。它们很容易被误用,以至于人们认为它们的使用总是不好的。使用更安全的替代方案。哪个是更安全的替代方案?
memcpy
strcpy
更安全。在这种情况下,使用strlen并不重要,如果我们从未定位的内存中读取,该功能将失败。否则,即使是坏的srings,我们也会分配足够的内存。memcpy与strcpy一样不安全