使用strcpy()函数的正确方法?
使用strcpy()函数的正确方法是什么?我用了两种方法,两次程序都运行得很好,所以我想知道什么是“更正确”的使用方法。我想把字符串s2复制到s1 这个:使用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)而不必在事实发生后执行显式返回
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
指向未首先释放的动态内存,则会导致内存泄漏。