wcsrtombs ()- 将宽字符串转换为多字节字符串 (可重新启动)

格式

#include <wchar.h>
size_t wcsrtombs (char *dst, const wchar_t **src, size_t len,
                  mbstate_t  *ps);

语言级别

ANSI

线程安全

是,如果第四个参数 ps不为 NULL。

语言环境敏感

此函数的行为可能受当前语言环境的 LC_CTYPE 类别影响。 如果在编译命令中指定了 LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF) ,那么此行为也可能受当前语言环境的 LC_UNI_CTYPE 类别影响。 当在编译命令上指定 LOCALETYPE (*CLD) 时,此功能不可用。 有关更多信息,请参阅 了解 CCSID 和语言环境

宽字符函数

有关更多信息,请参阅 宽字符

描述

此函数是 wcstombs()的可重新启动版本。

wcsrtombs() 函数将 src 间接指向的数组中的宽字符序列转换为以 ps描述的 shift 状态开始的相应多字节字符序列,如果 dst 不是空指针,那么会将其存储到 dst指向的数组中。 转换继续到并包含结尾的空宽字符,该字符也存储在该字符中。 转换将在两种情况下更早停止: 当达到与有效多字节字符不对应的代码时,或者 (如果 dst 不是空指针) 下一个多字节元素将超过要存储到 dst指向的数组中的总字节数 len 的限制时。 每次转换都像通过调用 wcrtomb()一样进行。

如果 dst 不是空指针,那么将为 src 指向的对象指定空指针 (如果转换由于到达结束空字符而停止) 或刚刚经过最后一个转换的宽字符的代码的地址。 如果转换由于到达结束空宽字符而停止,那么所描述的结果状态将是初始转换状态。

返回值

如果第一个代码不是有效的宽字符,那么将发生编码错误。 wcsrtombs() 在 errno 中存储宏 EILSEQ 的值,并返回(size_t)-1 ,但转换状态将保持不变。 否则,它将返回生成的多字节字符序列中的字节数,这与 dst 不是空指针时更改的数组元素数相同。

如果发生转换错误,那么可以将 errno 设置为 ECONVERT

示例

#include <stdio.h>
#include <wchar.h>
#include <string.h>
 
#define SIZE 20
 
int main(void)
{
   char     dest[SIZE];
   wchar_t *wcs = L"string";
   wchar_t *ptr;
   size_t   count = SIZE;
   size_t   length;
   mbstate_t ps = 0;
 
   ptr = (wchar_t *) wcs;
   length = wcsrtombs(dest, ptr, count, &ps);
   printf("%d characters were converted.\n", length);
   printf("The converted string is \"%s\"\n\n", dest);
 
   /* Reset the destination buffer */
   memset(dest, '\0', sizeof(dest));
 
   /* Now convert only 3 characters */
   ptr = (wchar_t *) wcs;
   length = wcsrtombs(dest, ptr, 3, &ps);
   printf("%d characters were converted.\n", length);
   printf("The converted string is \"%s\"\n\n", dest);
}
 
/*****************  Output should be similar to:  **********************
6 characters were converted.
The converted string is "string"
 
3 characters were converted.
The converted string is "str"
*/

相关信息