关注一个字符串转换函数
Concern of a string conversion function
我创建了一个从专有文本格式到带有转义 unicode 代码点的简单文本字符串的转换函数(格式为“\uXXXX”,其中 XXXX 是十六进制格式的 unicode 代码点)。
int wchar_to_utf16(wchar_t* strIn, char* strOut, int max_buf_len);
在这个函数中,我传递了指向要转换的字符串的指针、指向目标缓冲区(转换后的字符串将写入其中)的指针以及此类缓冲区的长度。
函数内部到处都有缓冲区边界检查,如果 space 不够,函数 returns 1 否则为 0。
我的问题是:我的函数是否关心了解缓冲区长度并执行检查,或者最好删除长度参数并对调用方进行检查?
问题:
最小缓冲区长度只能通过查看输入字符串并了解编码来确定(这不应该是调用者关心的问题)
您可以做的是遍历整个输入字符串以确定输出字符串所需的长度,然后分配该长度,然后进行转换。这样,您就不需要调用者指定 "maximum" 长度,调用者可能会猜错(然后呢?)。缺点是您必须检查整个输入字符串两次。
另一方面,调用者可能已经知道输入字符串的字符长度,例如通过调用 wcslen,这对调用者来说并不过分,所以如果该信息足以那么你的函数是的,让调用者提供它,他们可以计算一次并在他们再次需要它时保留该数字(以避免每次都通过整个输入字符串)。如果该信息不充分(我不能确定,因为我没有完全理解这个问题),那么不要指望最大缓冲区大小,因为这会暴露实现细节(当您函数需要字符串的字符长度)。
如果您愿意公开实现细节,那么最大缓冲区大小可能会起作用,但话又说回来,如果调用者猜错了大小,您会怎么做?全部转换浪费space?转换一点,因为整个事情不适合?如果你想要一个隐藏实现的干净接口,那么你自己计算缓冲区大小,除非你可以合理地期望调用者提供任何信息(例如字符串的长度)。
编辑:
你可以做的是编写一个名为 wchar_to_utf16_calc_len
的函数,它接受一个 wchar_t *
并计算将存储转换后的字符串的缓冲区的理想长度,而不实际分配任何东西然而。然后调用者可以分配理想长度的缓冲区并将缓冲区传递给转换函数。
此设置要求调用者对编码的了解不超过使用 wchar_to_utf16
函数所需的编码 和 (如果我弄错了请纠正我)删除需要在转换函数中进行边界检查,因为缓冲区将保证足够大(假设调用者正确地记得使用这个长度计算函数), 和 你将不必在转换函数中分配缓冲区,因为调用者知道要分配多大的数组。这消除了对长度参数的需要。
我创建了一个从专有文本格式到带有转义 unicode 代码点的简单文本字符串的转换函数(格式为“\uXXXX”,其中 XXXX 是十六进制格式的 unicode 代码点)。
int wchar_to_utf16(wchar_t* strIn, char* strOut, int max_buf_len);
在这个函数中,我传递了指向要转换的字符串的指针、指向目标缓冲区(转换后的字符串将写入其中)的指针以及此类缓冲区的长度。
函数内部到处都有缓冲区边界检查,如果 space 不够,函数 returns 1 否则为 0。
我的问题是:我的函数是否关心了解缓冲区长度并执行检查,或者最好删除长度参数并对调用方进行检查? 问题: 最小缓冲区长度只能通过查看输入字符串并了解编码来确定(这不应该是调用者关心的问题)
您可以做的是遍历整个输入字符串以确定输出字符串所需的长度,然后分配该长度,然后进行转换。这样,您就不需要调用者指定 "maximum" 长度,调用者可能会猜错(然后呢?)。缺点是您必须检查整个输入字符串两次。
另一方面,调用者可能已经知道输入字符串的字符长度,例如通过调用 wcslen,这对调用者来说并不过分,所以如果该信息足以那么你的函数是的,让调用者提供它,他们可以计算一次并在他们再次需要它时保留该数字(以避免每次都通过整个输入字符串)。如果该信息不充分(我不能确定,因为我没有完全理解这个问题),那么不要指望最大缓冲区大小,因为这会暴露实现细节(当您函数需要字符串的字符长度)。
如果您愿意公开实现细节,那么最大缓冲区大小可能会起作用,但话又说回来,如果调用者猜错了大小,您会怎么做?全部转换浪费space?转换一点,因为整个事情不适合?如果你想要一个隐藏实现的干净接口,那么你自己计算缓冲区大小,除非你可以合理地期望调用者提供任何信息(例如字符串的长度)。
编辑:
你可以做的是编写一个名为 wchar_to_utf16_calc_len
的函数,它接受一个 wchar_t *
并计算将存储转换后的字符串的缓冲区的理想长度,而不实际分配任何东西然而。然后调用者可以分配理想长度的缓冲区并将缓冲区传递给转换函数。
此设置要求调用者对编码的了解不超过使用 wchar_to_utf16
函数所需的编码 和 (如果我弄错了请纠正我)删除需要在转换函数中进行边界检查,因为缓冲区将保证足够大(假设调用者正确地记得使用这个长度计算函数), 和 你将不必在转换函数中分配缓冲区,因为调用者知道要分配多大的数组。这消除了对长度参数的需要。