DESCRIPTION
The wcslen() function is the wide-character
equivalent of the strlen(3) function. It determines
the length of the wide-character string pointed to by
s, not including the terminating L'\0' character.
Хитрость в том, что вы должны всегда искать код вида:
string = malloc(len);
очень подозрительно, потому что и wcslen(3)
и strlen(3)
возвращают длину строки без нулевого байта , и malloc(3)
должен выделять пространство с этим байтом. С отстой иногда.
Поэтому каждый раз, когда вы видите string = malloc(len);
, а не string = malloc(len+1);
, очень внимательно читайте, как присваивается len
.
char String = (char *)malloc(length + 1);
Должен сделать трюк. :)
EDIT
Лучше было бы спросить wcstombs()
о размере, выделяемом в первую очередь:
size_t len = wcstombs(NULL,src,0) + 1;
char *dest = malloc(len);
len = wcstombs(dest, src, len);
if (len == -1) /* handle error */ ...
+1
выделяет ascii nul, а wcstombs()
сообщит, сколько памяти требуется для преобразования. Он выполнит преобразование дважды , один раз для отслеживания требуемой памяти, а затем один раз для сохранения результата, но поддерживать его будет НАМНОГО проще. Во второй раз, когда он сохраняет результат, он записывает не более len
байтов , включая ascii nul .