0

这段代码有什么错误?我有一个错误

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.bufchar 指针吗?有什么问题char *s="abcd"?谢谢!:)

4

3 回答 3

5

错误消息是完全不言自明的。不清楚你不明白什么。例如,在您的join函数中,如果两个字符串加在一起的长度超过 255 个字符,就会发生可怕的事情。

此外,您的join功能完全被破坏了。它返回一个指向缓冲区的指针,该缓冲区一旦返回就不再存在,因为您在返回的堆栈上分配了它。

于 2015-02-26T10:23:06.723 回答
2

那是您试图提供帮助的实现

#define您可以通过在代码顶部添加以下内容来阻止它这样做

#define _CRT_SECURE_NO_WARNINGS

或按照建议使用strcat_s()

于 2015-02-26T10:24:18.897 回答
1

第一条消息是因为 strcat 不检查目标存储是否足够大以容纳连接的字符串。您可能会遇到缓冲区溢出。strcat_s有一个附加参数,即缓冲区长度。它将确保没有缓冲区溢出。

关于你的第二个问题,里面的代码join()是假的。您所做的是声明一个由 256 个字符组成的数组的局部变量。作为局部变量,它在join()终止时将被“销毁”。
然后你复制s1到这个缓冲区。请注意,缓冲区可能太小,您会遇到缓冲区溢出。

然后你调用strcat局部变量缓冲区作为第一个参数。结果s2将被附加到s1局部变量缓冲区中。返回的值strcat是缓冲区上的指针。返回时join(),缓冲区被“销毁”并且指针变得无效。

请注意,代码中的另一个问题是在join()main 中声明函数。您必须将此行移出 main 函数。

您定义结构和字符串变量的方式是正确的。这是你执行的方式join()是虚假的。

于 2015-02-26T10:33:32.093 回答