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