【发布时间】:2018-06-11 21:28:23
【问题描述】:
strcpy() 函数的正确使用方法是什么?我以两种方式完成了它,两次程序都运行得很好,所以我想知道使用它的“更正确”的方式是什么。我想将字符串 s2 复制到 s1。
这个:
s1=strcpy(s1, s2);
或者直接写:
strcpy(s1, s2);
【问题讨论】:
strcpy() 函数的正确使用方法是什么?我以两种方式完成了它,两次程序都运行得很好,所以我想知道使用它的“更正确”的方式是什么。我想将字符串 s2 复制到 s1。
这个:
s1=strcpy(s1, s2);
或者直接写:
strcpy(s1, s2);
【问题讨论】:
第二种方法是正确的。 strcpy() 的返回值始终与其第一个参数相同,因此您的第一个版本相当于:
strcpy(s1, s2);
s1 = s1;
第二个任务显然毫无意义。如果s1 是一个数组而不是一个指针变量,这将是无效的,因为你不能分配给数组。
【讨论】:
strcpy(s1, s2); s3 = s1;
s3指向你没有先释放的动态内存,这会导致内存泄漏。
函数签名是:
char* strcpy(char* destination, const char* source);
返回值为destination。如果你想使用这个值,你可以,否则你可以忽略它。
这适用于您想要return strcpy(x,y) 而无需在事后执行明确的return x 的情况。
请注意,像strcpy 这样的函数本质上是危险的,因为它们不能正确检查缓冲区长度。您可能应该使用strcpy_s 或类似的具有明确长度字段的东西,这样您就不会产生缓冲区溢出错误。
【讨论】:
strcpy() 之类的函数只有在您不知道源字符串有多大或目标数组有多大时才具有内在危险。如果你应该知道这两个,那么strcpy() 只是浪费;您可以使用 memmove() — 或 memcpy() — 进行复制。问题是,人们经常使用strcpy(),他们事先不知道大小,这可能会导致问题,但最终是“粗心的编码导致崩溃”,而不是strcpy()本身有什么问题。
-Wno-legacy-c-functions 来阻止你首先使用 strcpy 和朋友。
strcpy()的代码中。 strcpy_s() 函数仅在 Microsoft Windows 上可用;它们在类 Unix 平台上不可用,因为它们是 Annex K 中定义的 C11 的可选部分。查看Do you use the TR 24731 "safe" functions? 中的信息——包括从下一个 C 标准中删除(或至少在删除之前弃用)附件 K 的提案的链接。而且我不同意这些函数是危险的——危险的是使用这些函数的程序员。