[学习笔记]Windows程序设计:第二章 UNICODE
2012-12-30 16:18
441 查看
一、宽字符和C语言
C语言中的宽字符是基于wchar_t数据类型的,这个数据类型被定义在多个头文件中,包括WCHAR.Htypedef unsigned short wchar_t; wchar_t c = 'A'; wchar_t c = L'A';//也可以在单个字符常量前面使用L前缀,但这通常是不需要的。C编译器总是会在字符后面加0的。 wchar_t *pw = L"Hello!";//L(大写字母)紧接左引号。这向编译器表明这个字符串将用宽字符存储,每个字符占用2个字节。指针变量pw还是需要4个字节的存储空间。 iLength = wcslen(pw);//该函数返回的结果是6。 //wcslen函数的声明如下: size_t __cdecl wcslen(const wchar_t*);
Microsoft Visual C++包含的TCHAR.H表头文件中
#ifdef _UNICODE #define _tcslen wcslen #else #define _tcslen strlen #endif #ifdef _UNICODE #define wchar_t TCHAR #else #define char TCHAR #endif #ifdef _UNICODE #define __T(x) L##x #else #define __T(x) x #endif #define _T(x) __T(x) #define _TEXT(x) __T(x)
二、宽字符和Windows
1.Windows头文件类型
typedef char CHAR; typedef wchar_t WCHAR; typedef CHAR *PCHAR, *LPCH,*PCH,*NPSTR,*LPSTR,*PSTR; typedef CONST CHAR *LPCCH,*PCCH,*LPSTR,*PSTR; typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ; typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ; #ifdef UNICODE typedef WCHAR TCHAR, * PTCHAR ; typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ; typedef LPCWSTR LPCTSTR ; #else typedef char TCHAR, * PTCHAR ; typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ; typedef LPCSTR LPCTSTR ; #endif
2.Windows函数调用
#ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif
3.Windows的字符串函数
下面是Windows定义的一组字符串函数,这些函数用来计算字符串长度、复制字符串、连接字符串和比较字符串:ILength = lstrlen (pString) ; pString = lstrcpy (pString1, pString2) ; pString = lstrcpyn (pString1, pString2, iCount) ; pString = lstrcat (pString1, pString2) ; iComp = lstrcmp (pString1, pString2) ; iComp = lstrcmpi (pString1, pString2) ;
4.在Windows中使用printf
在windows编程中不能使用pirntf,但能使用sprintf,vsprintf系列int sprintf( char *buffer, const char *format [,argument] ... ); int vsprintf( char *buffer, const char *format, va_list argptr );
sprintf的第一个参数是一个字符缓冲区;后面是一个格式字符串。sprintf并不是将格式化结果写到标准输出,面是将其存入buffer。该函数返回该字符串的长度。在字符模式编程环境中,语句:
printf ("The sum of %i and %i is %i", 5, 3, 5+3) ;
的功能相同于以下语句:
char szBuffer [100] ; sprintf (szBuffer, "The sum of %i and %i is %i", 5, 3, 5+3) ; puts (szBuffer) ;
在Windows中,需要使用MessageBox而不是puts来显示结果。
vsprintf是sprintf的变形函数,它只有三个参数。vsprintf的前两个参数与sprintf相同,第三个参数是指向待格式化的参数数组的指针,该指针指向在堆栈中供函数调用的变量。宏va_list、va_start和va_end(在STDARG.H中定义)帮助处理堆栈指针。查阅STDARG.H中宏va_list、va_start和va_end的定义。
(这里不怎么懂,先写上,以后再回头看。参考博文:http://blog.csdn.net/udnova/article/details/551471)
#ifndef _VA_LIST_DEFINED #ifdef _M_ALPHA typedef struct { char *a0; /* pointer to first homed integer argument */ int offset; /* byte offset of next parameter */ } va_list; #else typedef char * va_list; #endif #define _VA_LIST_DEFINED #endif #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 )vsprintf和sprintf使用时有两个要注意的地方:
1.与printf一样当格式字符串与被格式化的变量不匹配时,可能会运行错误并可能造成程序崩溃。
2.用户的自定义的字符缓冲区必须足够大来存放结果,否则会造成缓冲区溢出(非法内存访问)。
所以由此引申出它们的第一个变种:最大长度版
int _snprintf( char *buffer, size_t count, const char *format [, argument] ... ); int _vsnprintf( char *buffer, size_t count, const char *format, va_list argptr );
相关文章推荐
- windows程序设计第二章学习笔记
- Windows核心编程学习笔记----第二章 UNICODE
- Windows 程序设计学习笔记二:Unicode
- Windows程序设计_Chap02_Unicode_学习笔记
- Windows程序设计_Chap02_Unicode_学习笔记
- Windows核心编程学习笔记----第二章 UNICODE
- windows程序设计学习笔记-Unicode,绘图基础
- 第二章---Unicode字符集学习笔记
- Windows程序设计_Chap01_起步_学习笔记
- windows程序设计第一章学习笔记
- javascript高级程序设计(第三版)-第二章 基本概念-学习笔记
- 第二章 Unicode编码 学习笔记
- 函数参数Windows程序设计_Chap01_起步_学习笔记
- Windows程序设计学习笔记
- Windows程序设计_Chap03_窗口与消息_学习笔记
- C# Windows 程序设计 学习笔记2 Paint事件
- Java学习笔记-Java程序设计环境(Windows)
- Windows 程序设计学习笔记(一)
- windows程序设计学习笔记-键盘,鼠标,计时器
- windows程序设计学习笔记-段落处理和GDI路径