【问题标题】:better approach to copy portion of char array than strncpy比 strncpy 更好的方法来复制 char 数组的一部分
【发布时间】:2018-03-31 12:24:09
【问题描述】:

我在 中使用std::strncpy 将一部分字符数组复制到另一个字符数组。似乎需要手动添加结束字符'\0',才能正确终止字符串。

如下,如果不明确将'\0'附加到num1,char数组后面可能有其他字符。

  char buffer[] = "tag1=123456789!!!tag2=111222333!!!10=240";
  char num1[10];
  std::strncpy(num1, buffer+5, 9);  
  num1[9] = '\0';

还有比这更好的方法吗?我想做一步操作来达到这个目标。

【问题讨论】:

  • 使用std::string。
  • string.substr 会帮助你。
  • tbh 这在 c++98 中也是可能的。我仍然在工作中写它
  • “我想有一个一步操作来达到这个目标”然后写一个实现你目标的函数,并调用它。
  • @Swift 他们使用 DOS 模拟器,如果可以解决问题的话

标签: c++98 c++ char strncpy


【解决方案1】:

是的,在 C 中使用“字符串”相当冗长,不是吗!

幸运的是,C++ 并没有这么局限:

const char* in = "tag1=123456789!!!tag2=111222333!!!10=240";
std::string num1{in+5, in+15};

如果您不能使用std::string,或者不想使用,那么只需将您描述的逻辑包装到一个函数中,然后调用该函数。


如下所示,如果没有显式将 '\0' 附加到 num1 后,char 数组可能会在后面部分包含其他字符。

不完全正确。没有“后期”。你认为你观察到的“后期部分”是你无权查看的其他记忆部分。由于未能以空终止您可能的 C 字符串,您的程序具有未定义的行为,并且计算机可能会做任何事情,例如时光倒流并谋杀我的曾曾祖母。非常感谢,朋友!

值得注意的是,因为是 C 库函数执行越界内存访问,如果您没有以这种方式使用这些库函数,那么您就不需要 以空终止 num1。仅当您想稍后将其视为 C 样式字符串时才需要这样做。如果你只是认为它是一个 10 字节的数组,那么一切都很好。

【讨论】:

  • Not quite correct. 我认为 OP 是指初始字符串的“后半部分”,因为他们试图提取第一个数字序列
  • @KillzoneKid:这不是我的解释。当然,这两种方式都不重要!
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多