【问题标题】:Do not understand about strcpy in C++不了解 C++ 中的 strcpy
【发布时间】:2020-08-03 16:28:48
【问题描述】:
char* s1;
strcpy(s1,"smilehihi");
s1[6] = 'a';

当我编译时,VS 没有任何错误。但是在运行时,我的代码出错了。我想我对 strcpy 不是很了解

【问题讨论】:

  • 你没有为s1分配任何空间
  • 也许你想使用strdup?
  • 这真是一道C题。 C++ 使用std::string
  • 当我编译时,VS没有任何错误 -- 编译器只检查语法错误,而不是如果你的程序逻辑正确。
  • @tadman - 我同意 M.M 的观点。当初学者正在学习 C++ 并使用在 C++ 中有效的 C 构造时,然后告诉他们他们正在使用 C——一种语言,据他们所知,他们没有学习——并没有太大帮助。最好不要理会标签,解决问题,然后 - 酌情 - 鼓励使用 C++ 中更可取的替代方案(如使用std::string)。

标签: c++ pointers strcpy


【解决方案1】:

首先你应该分配char* s1

char *s1 = new char[9]; // C++ version

或者你可以使用 C 版本:

char *s1 = (char*)malloc(9);

然后你可以使用下面的代码:

strcpy(s1, "smilehihi");
s1[6] = 'a';

【讨论】:

    【解决方案2】:

    您需要先通过 malloc() 或使用关键字 new 来分配变量。 最后也释放内存

    【讨论】:

      【解决方案3】:

      问题是您没有为您希望在s1:"smilehihi" 中存储的内容分配任何空间。您将s1 声明为指针变量,但它需要指向一些东西。您可以使用new 运算符分配空间。

      char* s1 = new char[stringLength + 1]; //stringLength = length of string stored
                                             // + 1 to hold null terminator character
      strcpy(s1, "smilehihi");
      s1[6] = 'a';
      

      您必须在主文件的顶部声明 #define _CRT_SECURE_NO_WARNINGS 以避免编译过程中由于 strcpy() 被弃用而出错。

      【讨论】:

      • 对于您的特定情况,smilehihi 是 9 个字符,加上空终止符将变为 10 个字符。将stringLength + 1 替换为 10,你应该会很好。还要确保在程序结束时delete s1; 取消分配您使用new 分配的内存。
      • 对于new[]分配的内存,你需要使用delete[]
      【解决方案4】:

      这里的主要问题不是strcpy() 函数,而是您没有为字符串本身分配任何内存的事实。 如果我是你,我会做类似的事情

      char* s1=(char*)malloc(SIZE); // the SIZE is the predefined maximum size of your string
      strcpy(s1,"smilehihi");
      s1[6] = 'a';
      

      编辑:

      作为建议,请考虑使用stpncpy()。它有助于避免缓冲区溢出,并且在您的情况下,将帮助您避免超过 char* 的最大大小

      char * stpncpy(char * dst, const char * src, size_t len);
      

      【讨论】:

      • stpncpy 是 POSIX 但不是标准 C++ ,因此它可能对 OP 可用也可能不可用
      • @M.M 你是对的,谢谢你的评论。如果正确,我仍然会说我的答案
      • 如果stpncpy()不可用,您可以使用strncpy()
      • strncpy 引入了自己的一系列问题。它不是 strcpy 的“安全”替代品。
      猜你喜欢
      • 2020-03-31
      • 2019-08-22
      • 1970-01-01
      • 2021-11-11
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多