我做了一个转换功能,从专有文本格式转换为带有转义的unicode代码点的简单文本字符串(格式为\ uXXXX,其中XXXX是十六进制格式的unicode代码点)。

int wchar_to_utf16(wchar_t* strIn, char* strOut, int max_buf_len);


在此函数中,我将指针传递给要转换的字符串,将指针传递给目标缓冲区(将在其中写入转换后的字符串)以及该缓冲区的长度。

函数内部有缓冲区绑定检查,如果空间不足,函数将返回1,否则返回0。

我的问题是:我的功能是否需要知道缓冲区长度并执行检查?还是最好删除length参数并在调用方上进行检查?
问题:
最小缓冲区长度只能通过查看输入字符串并知道编码来确定(调用者不必担心)

最佳答案

您可以做的是遍历整个输入字符串以确定输出字符串的所需长度,然后分配该数量然后进行转换。这样,您就避免了调用者指定“最大”长度的必要,调用者可能会猜到这是错误的长度(然后呢?)。缺点是您必须检查整个输入字符串两次。

另一方面,调用者可能已经知道了输入字符串的字符长度,例如通过调用wcslen,而这对于调用者来说并不是太多,所以如果信息足以满足您的功能,那么,让调用者提供它,他们可以计算一次,并在需要时再次保留该数字(以避免每次都遍历整个输入字符串)。如果这些信息不足(我不能完全理解这个问题,我就不能确定),那么不要指望最大缓冲区大小,因为这会暴露实现细节(当您的应用函数期望字符串的长度(以字符为单位)。

如果您可以公开实现的详细信息,那么最大缓冲区大小也许可以工作,但是如果调用者猜错了大小,该怎么办?转换所有浪费的空间?有点转换,因为整个事情都不适合吗?如果您想要一个干净的接口来隐藏实现,请自行计算缓冲区大小,除非可以合理地期望调用者提供任何信息(例如字符串的长度)。

编辑:

您可以做的是编写一个名为wchar_to_utf16_calc_len的函数,该函数接受一个wchar_t *并计算将存储转换后的字符串的缓冲区的理想长度,而实际上并未分配任何内容。然后,调用方可以分配具有理想长度的缓冲区,并将缓冲区传递给转换函数。

此设置要求调用者对编码的了解不超过使用wchar_to_utf16函数所需的信息,并且(如果我弄错了,请更正我)消除了对转换函数进行边界检查的需要,因为可以保证缓冲区是足够大(假设调用方正确记得使用此长度计算函数),并且您不必在转换函数内分配缓冲区,因为调用方会知道要分配多少数组。这消除了对length参数的需要。

10-08 10:50
查看更多