一、回顾C语言中的char数据类型
1、字符型常量
声明一个字符 char c;
声明时候初始化:char c='A';
这时,字符型变量c就会被ox41进行初始化,ox41也就是ASCII中的字符'A'
2、字符型数据的指针
char *p;
char *p = “Hello,World!”;
3、字符数组
char a[10];
char a[10] = “Hello”;
char a[] = “Hello”;
char型变量需要的内存为1个字节;
一个指针型变量在32位操作系统中需要4个字节
对于字符数组a[10]编译器则会自动保留10个字节的存储空间,对于char[]=”Hello”编译器根据字符串的长度给出6个字节的存储空间。
二、宽字符
一个Unicode字符占用2个字节的存储空间,如果我们想用C语言原有的数据类型来表示Unicode的2字节编码类型,则考虑选用 unsigned short int型数据表示一个2字节的字符。这一数据类型在头文件WCHAR.H中的定义为:
typedef unsigned short wchar_t;
所以C语言中的宽字符wchar_t数据类型与一个无符号短整形unsigned short一样,都是16位宽(ox41)
当我们想使用宽字符表示一个字符串,我们还要通知编译器这个字符串将使用宽字符存储,我们用大写的字母’L’(表示长整形)来将这一消息告诉编译器,例如:
wchar_t *p=L”Hello”; 将会用12个字节存储单元的内容。
三、有关宽字符的函数
宽字符串处理函数 # include
int sprintf(char *buffer,const char *format,[argument] -);
sprintf的第一个参数为字符缓冲区,后面的参数就像printf一样,是一个格式化字符串,函数的返回值为缓冲区buffer内的有效字符串长度。
在windows版的printf中,我们可以使用MessageBox函数来替代C语言的标准输入输出函数puts。
#include <stdio.h>
#include <windows.h>
int CDECL myMessageBox( TCHAR * szCaption, size_t iStyle, TCHAR * szFormat, ... )
{ //myMessageBox函数参数: 标题, 样式, 格式化输出内容
//CDECL为调用规则, 在WINDEF.H定义为: #define CDECL _cdecl
TCHAR szBuffer [1024] ;
va_list pArgs ;
va_start (pArgs, szFormat) ;
_vsnprintf( szBuffer, sizeof(szBuffer) / sizeof (TCHAR), szFormat, pArgs ) ;
//sizeof(szBuffer) / sizeof (TCHAR)得到最大能容下的字符个数
va_end (pArgs) ;
return MessageBox(NULL, szBuffer, szCaption, iStyle) ;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
int cxScreen, cyScreen ;
cxScreen = GetSystemMetrics (SM_CXSCREEN) ; //获取显示器x方向像素
cyScreen = GetSystemMetrics (SM_CYSCREEN) ; //获取显示器y方向像素
myMessageBox( TEXT ("显示器分辨率"), MB_OKCANCEL, TEXT ("显示器当前分辨率为:%dx%d。"), TEXT(cxScreen), TEXT(cyScreen) ) ;
return 0 ;
}