C - strcat出错

时间:2015-02-26 10:20:17

标签: c string struct strcat strcat-s

此代码中的错误是什么?我有错误

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"的问题是什么? 感谢:!)

3 个答案:

答案 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将附加到局部变量缓冲区中的s1strcat返回的值是缓冲区上的指针。 当join()返回时,缓冲区被“销毁”并且指针变为无效。

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

您定义struct和string变量的方式是正确的。这是你执行虚假join()的方式。