我在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字节的数组,那么一切都还不错。