如何解决strcpy 函数如何将大字符串复制到小字符串中?
在下面的代码中,我似乎可以将整个大字符串复制到一个小字符串中。
所以我的问题是,它是如何工作的?我只给 str1 分配了 2 个字符,但它能够存储更长的字符串。
我粘贴代码只是为了让我的观点更清楚:
char str1[2] = "a";
char str2[100] = "abcd";
cout<<"Before copying"<<endl;
cout<<"str1: "<<str1<<" size: "<<sizeof(str1)<<endl;
cout<<"str2: "<<str2<<" size: "<<sizeof(str2)<<endl;
strcpy(str1,str2);
cout<<"After copying"<<endl;
cout<<"str1: "<<str1<<" size: "<<sizeof(str1)<<endl;
cout<<"str2: "<<str2<<" size: "<<sizeof(str2)<<endl;
解决方法
所以我的问题是,它是如何工作的?
差。它不会做任何检查来确认您正在执行的操作是否有意义。您是负责检查的人(这显然会导致错误)。
strcpy
通常只是字节复制循环。它将数据写入递增地址。只要您写入的内存是“您的”,在这种复制打印后,字符串就可以正常工作;问题在于您覆盖的内存中的实际内容。
- 是的,您“很幸运”它没有破坏第二根弦。
strcpy
的要求要求您提供足够的输出存储。 - 通常不会,尤其是涉及到堆栈更上层的数组时。
- 这不是字符串大小,而是使用
sizeof
获得的静态数组大小。您可能会想到的是strlen
。
总而言之,永远不要在 C++ 中使用 C 函数,除非您有充分的理由使用 std::string
并且这些问题都不会发生。事实上,这就是你的编译器可能告诉你的:
错误 C4996 strcpy
:此函数或变量可能不安全。考虑改用 strcpy_s。
如果您听了,以下是运行程序时可以获得的结果:
然而,这些额外的检查并不能替代编写良好、表现良好的程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。