此代码中的错误是什么?我有错误
error C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead
它是什么意思?另一个问题 - 结构和函数原型的声明是合法的吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char *join(char *, char *);
printf("%s \n", join("duck", "soup"));
}
char *join(char *s1, char *s2)
{
struct {
char buf[256];
} string;
string.buf = "abcd";\\ new line. error l-value.
return strcat(strcpy(string.buf, s1), s2);
}
新行 - 为什么会出错?是不是string.buf
一个字符指针? char *s="abcd"
的问题是什么?
感谢:!)
答案 0 :(得分:5)
错误消息完全不言自明。目前尚不清楚你不明白的是什么。例如,在join
函数中,如果两个字符串一起超过255个字符,就会发生可怕的事情。
此外,您的join
功能完全被破坏了。它返回一个指向缓冲区的指针,该缓冲区一旦返回就不再存在,因为您将它分配给要返回的堆栈。
答案 1 :(得分:2)
那是your implementation trying to be helpful。
您可以通过在代码顶部添加以下#define
来阻止它执行此操作
#define _CRT_SECURE_NO_WARNINGS
或遵循建议并使用strcat_s()
。
答案 2 :(得分:1)
第一条消息是因为strcat不检查目标存储是否足以容纳连接字符串。您可能会遇到缓冲区溢出。 strcat_s
有一个附加参数,即缓冲区长度。它将确保没有缓冲区溢出。
关于你的第二个问题,join()
中的代码是假的。
你要做的是声明一个256字符数组的局部变量。作为局部变量,当join()
终止时,它将被“销毁”
然后,将s1
复制到此缓冲区中。请注意,缓冲区可能太小,您将获得缓冲区溢出。
然后使用局部变量缓冲区作为第一个参数调用strcat
。结果是s2
将附加到局部变量缓冲区中的s1
。
strcat
返回的值是缓冲区上的指针。
当join()
返回时,缓冲区被“销毁”并且指针变为无效。
请注意,代码中的另一个问题是在main中声明函数join()
。您必须将此行移出主函数。
您定义struct和string变量的方式是正确的。这是你执行虚假join()
的方式。