微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

strcpy 函数如何将大字符串复制到小字符串中?

如何解决strcpy 函数如何将大字符串复制到小字符串中?

在下面的代码中,我似乎可以将整个大字符串复制到一个小字符串中。

所以我的问题是,它是如何工作的?我只给 str1 分配了 2 个字符,但它能够存储更长的字符串。

  1. 这是否意味着 strcpy 正在修改堆栈上不属于我们的内存?
  2. 堆栈上的数组在初始化后是否可以动态增长?
  3. str1 大小在复制操作后没有改变,但它持有更长的字符串。太疯狂了!

我粘贴代码只是为了让我的观点更清楚:

    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;

enter image description here

解决方法

所以我的问题是,它是如何工作的?

差。它不会做任何检查来确认您正在执行的操作是否有意义。您是负责检查的人(这显然会导致错误)。

strcpy 通常只是字节复制循环。它将数据写入递增地址。只要您写入的内存是“您的”,在这种复制打印后,字符串就可以正常工作;问题在于您覆盖的内存中的实际内容。

  1. 是的,您“很幸运”它没有破坏第二根弦。 strcpy 的要求要求您提供足够的输出存储。
  2. 通常不会,尤其是涉及到堆栈更上层的数组时。
  3. 这不是字符串大小,而是使用 sizeof 获得的静态数组大小。您可能会想到的是 strlen

总而言之,永远不要在 C++ 中使用 C 函数,除非您有充分的理由使用 std::string 并且这些问题都不会发生。事实上,这就是你的编译器可能告诉你的:

错误 C4996 strcpy:此函数或变量可能不安全。考虑改用 strcpy_s。

如果您听了,以下是运行程序时可以获得的结果:

MSVCC strcpy error

然而,这些额外的检查并不能替代编写良好、表现良好的程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。