C - strcat 错误
C - Error with strcat
这段代码有什么错误?我有一个错误
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"
有什么问题?
谢谢!:)
错误消息完全不言自明。不清楚你不明白的是什么。例如,在您的 join
函数中,如果两个字符串的总长度超过 255 个字符,就会发生可怕的事情。
此外,您的 join
功能已完全损坏。它 returns 一个指向缓冲区的指针,一旦它 returns 就不再存在,因为您将它分配到要返回的堆栈上。
那是 your implementation trying to be helpful。
您可以通过在代码顶部添加以下 #define
来阻止它这样做
#define _CRT_SECURE_NO_WARNINGS
或按照建议使用strcat_s()
。
第一条消息是因为 strcat 不检查目标存储是否足够大以容纳连接的字符串。您可能会遇到缓冲区溢出。 strcat_s
有一个附加参数,即缓冲区长度。它将确保没有缓冲区溢出。
关于你的第二个问题,join()
中的代码是伪造的。
您所做的是声明一个局部变量,它是一个 256 个字符的数组。作为局部变量,当 join()
终止时它将是 "destroyed"。
然后将 s1
复制到此缓冲区中。请注意,缓冲区可能太小而导致缓冲区溢出。
然后你用局部变量 buffer 作为第一个参数调用 strcat
。结果是 s2
将附加到局部变量缓冲区中的 s1
。
strcat
的值 return 是缓冲区上的指针。
当join()
returns时,缓冲区为"destroyed",指针失效。
请注意,您代码中的另一个问题是在 main 中声明函数 join()
。您必须将此行移出 main 函数。
您定义结构和字符串变量的方式是正确的。你执行 join()
的方式是假的。
这段代码有什么错误?我有一个错误
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"
有什么问题?
谢谢!:)
错误消息完全不言自明。不清楚你不明白的是什么。例如,在您的 join
函数中,如果两个字符串的总长度超过 255 个字符,就会发生可怕的事情。
此外,您的 join
功能已完全损坏。它 returns 一个指向缓冲区的指针,一旦它 returns 就不再存在,因为您将它分配到要返回的堆栈上。
那是 your implementation trying to be helpful。
您可以通过在代码顶部添加以下 #define
来阻止它这样做
#define _CRT_SECURE_NO_WARNINGS
或按照建议使用strcat_s()
。
第一条消息是因为 strcat 不检查目标存储是否足够大以容纳连接的字符串。您可能会遇到缓冲区溢出。 strcat_s
有一个附加参数,即缓冲区长度。它将确保没有缓冲区溢出。
关于你的第二个问题,join()
中的代码是伪造的。
您所做的是声明一个局部变量,它是一个 256 个字符的数组。作为局部变量,当 join()
终止时它将是 "destroyed"。
然后将 s1
复制到此缓冲区中。请注意,缓冲区可能太小而导致缓冲区溢出。
然后你用局部变量 buffer 作为第一个参数调用 strcat
。结果是 s2
将附加到局部变量缓冲区中的 s1
。
strcat
的值 return 是缓冲区上的指针。
当join()
returns时,缓冲区为"destroyed",指针失效。
请注意,您代码中的另一个问题是在 main 中声明函数 join()
。您必须将此行移出 main 函数。
您定义结构和字符串变量的方式是正确的。你执行 join()
的方式是假的。