比strncpy

时间:2018-03-31 12:24:09

标签: c++ char strncpy

我在中使用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';

有比这更好的方法吗?我希望通过一步操作来实现这一目标。

1 个答案:

答案 0 :(得分:3)

是的,在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库函数执行了超出范围的内存访问,如果你没有以这种方式使用这些库函数,那么你就不会需要 null-terminate num1。只有当您希望以后将其视为C风格的字符串时才需要。如果你只是认为它是一个10字节的数组,那么一切都还可以。