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

如下所示,如果未将'\0'显式附加到num1,则char数组在后面的部分中可能还有其他字符。

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


有没有比这更好的方法了?我想通过一步操作来实现此目标。

最佳答案

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

幸运的是,C ++不受此限制:

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


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




  如下所示,如果未在num1后面显式附加'\ 0',则char数组在后面的部分中可能还有其他字符。


不太正确。没有“后面的部分”。您认为观察到的“后期部分”是您无权查看的内存的其他部分。由于无法以空值终止您可能要使用的C字符串,因此程序具有未定义的行为,并且计算机可以执行任何操作,例如时光倒流和谋杀我的曾曾祖母。非常感谢,朋友!

那么,值得注意的是,由于C库函数执行了超出范围的内存访问,因此,如果您没有以这种方式使用这些库函数,则无需以空终止。仅当您以后想要将其视为C样式的字符串时,才需要这样做。如果您只是将其视为10字节的数组,那么一切都还不错。

09-30 14:49
查看更多