字符串转换函数的问题
Concern of a string conversion function
我做了一个从专有文本格式到带有转义unicode代码点的简单文本字符串的转换函数(格式为`\uXXXX',其中XXXX是十六进制格式的unicode代码点)。
int wchar_to_utf16(wchar_t* strIn, char* strOut, int max_buf_len);
在这个函数中,我传递指向要转换的字符串的指针、指向目标缓冲区(将在其中写入转换后的字符串)的指针以及该缓冲区的长度。
在函数内部,到处都是缓冲区绑定检查,如果空间不够,函数将返回1,否则返回0。
我的问题是:我的函数关心的是知道缓冲区长度并执行检查,还是最好删除长度参数并对调用方进行检查?问题:最小缓冲区长度只能通过查看输入字符串并了解编码(这不应该是调用方关心的问题)来确定
您可以通过整个输入字符串来确定输出字符串所需的长度,然后分配该数量,然后进行转换。这样,您就不需要调用方指定"最大"长度,而调用方可能会猜错(然后呢?)。缺点是必须对整个输入字符串进行两次检查。
另一方面,调用方可能已经知道输入字符串的字符长度,例如通过调用wcslen,这对调用方来说并不太期望,所以如果这些信息对于您的函数来说足够,那么是的,让调用方提供它,他们可以计算一次,并在再次需要时保留这个数字(以避免每次都遍历整个输入字符串)。如果这些信息还不够(我不能确定,因为我没有完全理解这个问题),那么不要期望最大缓冲区大小,因为这会暴露实现细节(当函数期望字符串的字符长度时,情况并非如此)。
如果您对公开实现细节很满意,那么最大缓冲区大小可能会起作用,但话说回来,如果调用者猜错了大小,您会怎么办?转换所有浪费空间的东西?因为整个东西不合适而转换一点?如果您想要一个隐藏实现的干净接口,那么您可以自己计算缓冲区大小,除非您可以合理地期望调用者提供任何信息(例如字符串的长度)。
编辑:
您可以编写一个名为wchar_to_utf16_calc_len
的函数,该函数接收wchar_t *
,并计算存储转换字符串的缓冲区的理想长度,而不需要实际分配任何内容。然后,调用者可以分配具有理想长度的缓冲区,并将缓冲区传递给转换函数。
此设置要求调用方对编码的了解不超过使用wchar_to_utf16
函数和所需的信息(如果我弄错了,请纠正我),因为缓冲区将保证足够大(假设调用方正确记住使用此长度计算函数),因此无需在转换函数中进行边界检查,和您将不必在转换函数内分配缓冲区,因为调用者将知道要分配多大的数组。这样就不需要长度参数了。
- Visual Studio中的函数声明和函数定义问题
- C++quit()函数中可能存在作用域问题
- 类似于strcat()的函数出现问题
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 类C++中的函数问题(LNK2019和LNK1120错误)
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 关于简单C++函数(is_palindrome)的逻辑的问题
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- constexpr构造函数需要常量成员函数时出现问题
- 添加存储在向量中的大整数的函数出现问题
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 关于 c++ 函数中指针赋值的简单问题
- 如何在标头中声明(或定义)函数的问题
- 有关 c++ 构造函数的问题
- 模板类转换问题 - 无法推断调用的函数
- 从 C++ 中的函数返回数组地址问题
- 关于复制构造函数的一个棘手问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题