在C中用wchar_t *构造char *所需的大小

时间:2017-01-03 10:12:28

标签: c char wchar-t wchar

我试图将wchar_t *转换为char *并且我的内存浪费解决方案是

char *wstrtostr(const wchar_t *text) {
    size_t size = wcslen(text)*sizeof(wchar_t)+1;
    char *sa = malloc(size);
    wcstombs(sa,text,size);
    return sa;
}

一个字符可能是单字节或多字节,wcslen会计算它们,无论它们的大小与字符大小相同。

问题是我们如何确定wchar的等效char大小,以便我们可以为这个特定问题构建wcslen的替代方法,从而确定构建char指针所需的大小?

1 个答案:

答案 0 :(得分:2)

要回答您的问题,您可以反复呼叫wcstombs bytes慢慢增加,直到您收到存储的内容。然而,不确定你似乎想做什么有多高效。也许你会想要一个不同的方法:

分配一些记忆。致电wcsrtombs。如果src最终没有为NULL,那么你的内存不足realloc并再次从上次停止的地方再次呼叫wcsrtombs

根据您的数据,您可以构建一个启发式,以便首先分配多少内存,因此重新分配很少。

更新:事实证明,如果您在Linux下运行,并且不需要可移植性或C99兼容性,那么还有另一种方法。如果以{NULL}作为目标调用wcstombs,则它将返回所需的字节数。然后,您可以分配此字节数并再次调用wcstombs。哪种方法会更好取决于你的具体情况,具体来说我想象的是字符串的长度以及你的启发式在猜测正确长度时的好坏。另外,重申一下,如果您的代码需要是可移植的,那么这是一个非标准的API。感谢melpomene指针。

第二次更新:根据C99,wcsrtombs确实支持将其dest指针设置为NULL以获得输出缓冲区所需的长度。感谢Story Teller。因此,您可以使用NULL调用一次,然后使用适当大小的缓冲区调用第二次。