【发布时间】:2014-06-12 14:46:42
【问题描述】:
我是初学者,现在正在学习如何在 C 中复制字符串。
这是我刚刚遇到的一个问题:
每次我尝试使用“strcpy”命令从字符串 1 复制到字符串 2 时,Visual Studio 2013 都会给我一条错误/警告消息,指出“strcpy”不安全,并建议我改用 strcpy_s。
你能解释一下为什么 strcpy 使用起来不安全吗?还有什么比 strcpy 更安全?
这是我的代码:
#include<stdio.h>
#include<string.h>
main()
{
char str1[] = "Copy a string.";
char str2[15];
char str3[15];
int i;
/* with strcpy() */
strcpy(str2, str1);
/* Without strcpy() */
for (i = 0; str1[i]; i++)
str3[i] = str1[i];
str3[i] = '\0';
/* Display str2 and str3 */
printf("The content of str2: %s\n", str2);
printf("The content of str3: %s\n", str3);
return 0;
}
附:我在 Windows 7 64 位终极版上使用 Visual Studio 2013 64 位终极版。 感谢您的宝贵时间!
【问题讨论】:
-
实际上,当 MSVC 编译器告诉您
strncpy也是不安全的时,事情变得很有趣。他们希望您使用strncpy_s,它添加了第二个参数来指示大小并修改strncpy的标准行为,以便截断的字符串附加一个空终止符。不用说,所有这些_s函数都是非标准的,我通常只是定义某个预处理器定义来消除该警告。 -
strcpy() 不是不安全的,微软是不安全的。 c99标准的支持在哪里?顺便说一句:“不安全”是 PHB 的说法,最好忽略它。 BTW2:main 的原型是:
int main(void)或int main(int argc, char **argv) -
是的,微软也想拥抱、扩展、消灭 C。
strcpy()是一个非常安全的函数(不像,比如说,gets())在右手中。不幸的是,很多程序员编码不好,然后要求“更安全”的语言。懦夫。 -
...因为 C 字符串本质上是不安全的:(
-
建议:
char str2[sizeofstr1];并避免使用像15这样的幻数。让编译器完成计算所需大小的工作。