C 编程/wchar.h/函数参考
fgetws
是 C 编程语言中的一个函数。它是 fgets
函数的宽字符版本。fgetws
中的 w 代表宽。fgetws
根据流是文本/二进制模式打开,分别将字符串读取为多字节字符或宽字符字符串。fgetws
子例程从输入流读取字符,将其转换为相应的宽字符代码,并将它们放置到字符串参数指向的数组中。
该子例程将持续执行,直到:
- 读取了由数字参数 "-1" 指定的字符数量
- 该子例程遇到换行符或 EOF 字符。
fgetws 子例程以 NULL 宽字符终止宽字符字符串。
#include <stdio.h>
#include <wchar.h>
wchar_t *fgetws(
wchar_t *string;
int n;
FILE *stream ;
);
fgetws 有三个参数
string
- 用于提供数据存储位置的字符串n
- 可读字符的最大数量stream
- FILE 指针
虽然 fgetws 相对于 fgets 更宽,但它可以通过与 stdio.h 一起使用的另一个可选头文件 wchar.h 进行编译。但是,fgets 必须使用 stdio.h。因此,fgetws 提供了选择。
与 fgets 函数一样,fgetws 函数也返回相同的值字符串,即成功时返回 ws。该函数使用 NULL 指针处理错误条件。对于错误甚至在 EOF(文件结尾)时,函数调用都返回 NULL 指针。也可以使用 feof 或 ferror 来确定错误。
ubuntu、fedora、ANSI、Win 98、Win Me、Win NT、Win 2000、Win XP
- http://pubs.opengroup.org/onlinepubs/009695399/functions/fgetws.html
- https://freebsd.ac.cn/cgi/man.cgi?query=fgetws&apropos=0&sektion=0&manpath=FreeBSD+7.1-RELEASE&format
- http://msdn.microsoft.com/en-us/library/c37dh6kf(v=vs.71).aspx
- http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/getws.htm
mbrlen 是标准库函数,用于使用转换状态确定多字节字符的长度。mbrlen 函数与其 'mblen' 'mblen l' 的区别在于其可重启性。
要在程序中使用此函数,请包含标准头文件<wchar.h>。
size_t mbrlen (const char *s, size_t maxsize, mbstate_t *ps ).
mbrlen() 函数最多检查指向 i.e. s 的字符串的 maxsize,并提取下一个完整的 multibyte character。它更新 shift state *ps。如果 multibyte character 不是 NULL wide character,则返回 s 消耗的字节数。
(size_t) - 2 : 在所有 maxsize character 被转换后,生成的转换状态指示一个不完整的 multibyte character。
(size_t) - 1 : 该函数在完成下一个 multibyte character 之前检测到编码错误,在这种情况下,该函数会将 errno 设置为 EILSEQ,并使生成的转换状态未定义。
0 : 下一个完整的 character 是一个 null character,在这种情况下,生成的转换状态是初始转换状态。
正数 : 如果下一个 n 或更少的 byte 完成一个有效的 character ; 返回的值将是完成 character 的字节数。
- http://pubs.opengroup.org/onlinepubs/9699919799/functions/mbrlen.html .
- http://www.qnx.com/developers/docs/6.5.0/index.jsp?topic=/com.qnx.doc.neutrino_lib_re/m/mbrlen.html.
- http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.basetechref/doc/basetrf1/mbrlen.htm.
mbrtowc() 使用转换状态将 multibyte character 转换为 wide character
#include <wchar.h>
size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps);
假设 s 是一个空指针。那么可以将 mbrtowc() 函数调用为
mbrtowc(NULL, "", 1, ps);
这里 pwc 和 n 的值会被忽略。
如果 s 不是 NULL,该函数应该检查从 s 最初指向的位置开始的最多 n 个字节,以确定完成下一个 character 所需的字节数,并确定相应 wide character 的值。然后,如果 pwc 不是空指针,则将该值存储在 pwc 指向的对象中。如果该相应 wide character 是 wide null character,则无论生成的转换状态是什么,都将是初始转换状态。
如果指定的 state pointer i.e. 如果 ps 是一个空指针,那么 mbrtowc() 函数应该使用它自己的 mbstate_t 对象,该对象应该在程序启动时初始化为初始转换状态。否则,应使用 ps 指向的 mbstate_t 对象来描述关联 character 序列的当前转换状态。
s:
s 用于作为要转换或计数的字符串的字节。
n:
n 用于指定要检查的最大字节数。
ps:
ps 是转换状态。如果这是空值,则使用内部 mbstate_t 对象。
0:
当下一个 count 或更少的字节完成代表 null wide character 的 multibyte character 时,它返回 0。
>0:
当下一个 count 或更少的字节完成有效的 multibyte character 时,它返回大于零的值,即正值,返回的值是完成 multibyte character 的字节数。
-1:
当发生编码错误时,它返回 -1,即下一个 count 或更少的字节没有为完整的有效 multibyte character 做出贡献,errno 值将为 EILSEQ,并且转换状态令人困惑,因为它可以以多种方式理解。
-2
当下一个 count 个字节对不完整的 multibyte character 做出贡献,并且所有 count 个字节都已处理时,它返回 -2。
http://pubs.opengroup.org/onlinepubs/009604499/functions/mbrtowc.html
Putwc()
c 用于要写入的字符。stream 用于指向 **FILE** 结构的指针。
这是一个标准库函数。此函数将宽字符写入 FILE 流。它包含在标准库 Wchar.h 中。putwc() 函数将宽字符写入输出流。它相应地向前移动文件位置。putwc() 函数与 fputwc() 相同。
成功时,此函数返回 0。否则它将返回非零值。
swprintf是 C 标准库 函数,如 wchar.h 中所定义,其必需的头文件是 stdio.h 和 wchar.h。它的函数签名为
'int swprintf(wchar_t *s,, size_t n, const wchar_t format,...);
swprintf 的签名
s : 它指向缓冲区的指针,您希望将格式化的字符串存储在其中。格式化字符串提供所需的额外参数
n : 它是要存储在缓冲区中的最大字符数,附加空字符。
format : 这是一个宽字符字符串,显示输出的格式。
swprintf 函数将宽字符输出到宽字符数组。程序员必须确保在 's' 处至少有 'n' 个宽字符的空间。
swprintf() 是在 *s 开始的连续宽字符中的空字符之后打印输出的函数。它最多打印 n 个字符,直到出现下一个空字符。swprintf 是 sprintf 的宽字符版本。指向 swprintf 的指针参数是宽字符字符串
此函数返回写入的字符数,如果存在错误,则返回 -1。如果 s(指向缓冲区的指针)或 format 是空指针,则会调用无效参数。如果程序允许运行此代码,则它返回 -1 或 errno 设置为 EINVAL。swprintf 返回存储在 's'(缓冲区)中的宽字符数,不计算最后一个空字符。
#include <wchar.h> wchar_t *wcscat(wchar_t *a, const wchar_t *b);
strcat 和 Wcscat 函数完成的工作与前面提到的相同,即连接两个字符串。不同之处在于 strcat 函数接受(普通)**字符字符串**,而 wcscat 函数接受**宽字符字符串**作为参数。
wcscat 函数将宽字符字符串复制为例如 **b**,包括 '\0'(在字符串 b 的末尾),在宽字符字符串的末尾,例如 **a**。字符串 a 的 '\0' 字符被字符串 'b' 的第一个字符替换。即函数将字符串 'b' 附加到字符串 'a' 的末尾。如果宽字符字符串 'a' 是 "hello",而宽字符字符串 'b' 是 "world"。在调用函数 wcscat(a , b) 之后,字符串 'a' 变为 "helloworld",而字符串 'b' 保持不变。宽字符串 'a' 必须至少具有 (strlen(a) + strlen(b) +1) 字节的内存,以便它可以存储 wcs(宽字符字符串)'a',wcs 'b' 和 '\0'。
#include <stdio.h>
#include <wchar.h>
#define SIZE 32
int main() {
wchar_t destination[SIZE] = L"Hello"; /*SIZE should be sufficient enough to store both strings and NULL termination '\0' */
wchar_t * source = L" World";
wchar_t * ptr;
ptr = wcscat( destination, source );
printf(" %ls\n", ptr ); /* prints "hello World"*/
/*OR printf("%ls\n" , destination);*/
return 0;
}
程序的输出将是 ' Hello World '。
宽字符字符串 'source'(World)附加在宽字符字符串 'destination'(Hello)的末尾。
wcscat() 函数返回指向宽字符字符串 'a' 的指针,即指向连接字符串的指针。
在 C 语言中,函数 wcscmp 包含在头文件 wchar.h 中,wcscmp 类似于 strcmp,即它用于比较两个字符串。但是函数 wcscmp 用于比较宽字符字符串。如果要比较两个宽字符字符串,例如 s1 和 s2。然后函数 wcscmp 如果 s1 大于 s2,则返回正整数。如果字符串 s2 大于 s1,则返回负整数。如果两个宽字符字符串(即 s1 和 s2)相同,则函数返回 0。
#include <wchar.h> int wcscmp(const wchar_t *s1, const wchar_t *s2);
#include <stdio.h>
#include <wchar.h>
int main() {
wchar_t string1[] = L"char";
wchar_t string2[] = L"character";
int difference;
difference = wcscmp( string1, string2 );
if ( difference == 0 )
printf( " Both strings are same" );
else {
if ( difference < 0 )
printf( " char is less than character\n" );
else
printf(" char is greater than character\n" );
}
return 0;
}
程序的输出将是 'char 小于 character '
因为差值的符号为负。
Wcsncmp 是用于比较两个宽字符字符串的标准库函数。该函数类似于标准库函数 strcmp。但比较不像 strcmp。第一个区别是函数 wcsncmp 最多比较两个字符串到某个限制(最多 n 个字符),即 **size_t n**,但 strcmp 比较字符串直到出现 '\0'。第二个区别是它处理宽字符,如前所述。它比较指向例如 **a** 的宽字符字符串和指向例如 **b** 的宽字符字符串,但最多比较每个字符串的 **n** 个宽字符。
如果宽字符字符串 **a** 在第一个不同位置 i(i < n)处大于宽字符字符串 **b**,则函数 Wcsncmp 返回正整数,如果第二个字符串在第一个不同位置 i(i < n)处大于第一个字符串,则函数 wcsncmp 返回负整数。如果 **a** 和 **b** 的前 i 个字符(i < n)相等,则函数 wcsncmp 返回 0。
在 C 编程语言中,使用函数 wcsncmp()、wcscat()、labs、mempcpy。函数 wcscpy 类似于 strcpy()。strcpy() 用于复制字符串,而 wcscpy() 用于处理宽字符串以进行复制。它将 src 指向的宽字符字符串(包括终止的 L'\0' 字符)复制到 dest 指向的数组中。