使用strcpy()函数的正确方法?

使用strcpy()函数的正确方法?,c,strcpy,C,Strcpy,使用strcpy()函数的正确方法是什么?我用了两种方法,两次程序都运行得很好,所以我想知道什么是“更正确”的使用方法。我想把字符串s2复制到s1 这个: s1=strcpy(s1, s2); 或者只是写: strcpy(s1, s2); 函数签名为: char* strcpy(char* destination, const char* source); 返回值为目的地。如果你想利用这个值,你可以,但是你可以忽略它 这适用于希望返回strcpy(x,y)而不必在事实发生后执行显式返回

使用strcpy()函数的正确方法是什么?我用了两种方法,两次程序都运行得很好,所以我想知道什么是“更正确”的使用方法。我想把字符串s2复制到s1

这个:

s1=strcpy(s1, s2);  
或者只是写:

strcpy(s1, s2);

函数签名为:

char* strcpy(char* destination, const char* source);
返回值为
目的地
。如果你想利用这个值,你可以,但是你可以忽略它

这适用于希望
返回strcpy(x,y)
而不必在事实发生后执行显式
返回x
的情况


请注意,
strcpy
之类的函数本质上是危险的,因为它们没有正确检查缓冲区长度。您可能应该使用strcpy\u s或类似的东西,它有一个显式的长度字段,这样您就不会产生缓冲区溢出错误。

第二种方法是正确的。
strcpy()
的返回值始终与其第一个参数相同,因此您的第一个版本相当于:

strcpy(s1, s2);
s1 = s1;

第二项任务显然毫无意义。如果
s1
是一个数组而不是指针变量,那么它将是无效的,因为您不能分配给数组。

@Barmar,是的。修正了。只有在不知道源字符串有多大或目标数组有多大的情况下,像strcpy()这样的函数才有本质上的危险。如果您知道这两个,那么
strcpy()
仅仅是浪费;您可以使用
memmove()
-或
memcpy()
-进行复制。问题是,人们通常在事先不知道大小的情况下使用strcpy(),这可能会导致问题,但归根结底是“粗心的编码导致崩溃”,而不是
strcpy()
本身的任何错误。@JonathanLeffler问题在于崩溃往往是可以利用的行为的暗示,所以他们不是无害的。如果你在写C代码的话,这种情况和崩溃通常是非常糟糕的,因为你需要一些快速可靠的东西。总之,GCC和clang应该有一个
-Wno-legacy-c-functions
,它首先阻止您使用
strcpy
和friends。错误在于调用
strcpy()
的代码中。
strcpy_s()
函数仅在Microsoft Windows上可用;它们在类Unix平台上不可用,因为它们是中定义的C11的可选部分。查看-中的信息,包括从下一个C标准中删除(或至少在删除前弃用)附录K的建议链接。我不同意函数是危险的——使用函数的程序员才是危险的。所以我基本上在第一个函数中写了s1=s1?但你也把字符串复制到了s1。是的,这就是我的意图,所以如果我写了s3=strcpy(s1,s2);我会将s2同时复制到s1和s3?它相当于
strcpy(s1,s2);s3=s1
如果
s3
指向未首先释放的动态内存,则会导致内存泄漏。