stprintfs和stscanfs函数与UNICODE编码.doc_第1页
stprintfs和stscanfs函数与UNICODE编码.doc_第2页
stprintfs和stscanfs函数与UNICODE编码.doc_第3页
stprintfs和stscanfs函数与UNICODE编码.doc_第4页
stprintfs和stscanfs函数与UNICODE编码.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

版权所有。转载请注明出处。_stprintf_s和_stscanf_s函数与UNICODE编码一、核心内容n 该文档适用于微软的visual C+ 平台。n 需要头文件:n MSDN上对stprintf_s和_stscanf_s函数的定义:TCHAR.H routine _UNICODE & _MBCS not defined _MBCS defined _UNICODE defined _stprintf_s sprintf_s sprintf_s swprintf_s_stscanf_s sscanf_s sscanf_s swscanf_s对应的代码为:#ifdef UNICODE#define _stprintf_s swprintf_s#else#define _stprintf_s sprintf_s 前面的t表示编码,后面的_s表示检查内存溢出,前面的_表示非标准库函数。 从上我们可以看出,_stprintf_s和_stscanf_s是为适应不同编码而定义的两个宏,在不同的编码环境下他们所表示的函数是不同的。 _s是security的意思,具体含义参见后面的Security Remarks部分。(1)int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format , argument . ); /ANSI版本int swprintf_s(wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format ,argument.); /UNICODE版本 这个函数的主要作用是将若干个argument按照format格式存到buffer中。 buffer:输出的字符 sizeOfBuffer:buffer的长度,以能存放的字符数计算,而不是已占用的字节数计算。非常关键。一个UNICODE字符占用2个字节。 format:格式字符串,比如%s argument:可选参数(2)int sscanf_s( const char *buffer, const char *format , argument . ); int swscanf_s( const wchar_t *buffer, const wchar_t *format , argument . );函数具体细节参考/en-us/library/t6z7bya3(v=vs.80).aspx 。 这个函数的主要作用是从buffer中读取指定格式(format)的字符到相应的argument中。参数同上Security Remarks:Unlike the less secure version sscanf, a buffer size parameter sizeOfBuffer is required when using the type field characters c, C, s, S and . This parameter must be supplied as an additional parameter after each buffer which requires it. 用于检查内存是否溢出。几个需要注意的细节: 为了让编译器识别Unicode字符串,必须以在前面加一个“L”, 定义宽字节类型方法如下:L“ABC”,表示字符串“ABC”是用UNICODE编码的。 char与wchar_t的区别: char中存放的是单字节型的字符,wchar_t中存放的是双字节型的字符,TCHAR在定义了_UNICODE时等同于wchar_t,在未定义_UNICODE时等同于char。例子1 (sscanf_s和printf_s,用于ANSI编码):/ crt_sscanf_s.c/ This program uses sscanf_s to read data items/ from a string named tokenstring, then displays them. #include int main( void ) char tokenstring = 15 12 14.; char s81; char c; int i; float fp; / Input various data from tokenstring: / max 80 character string plus NULL terminator sscanf_s( tokenstring, %s, s, sizeof(s) ); /对照上面的Security Remarks部分进行理解 sscanf_s( tokenstring, %c, &c, sizeof(char) ); sscanf_s( tokenstring, %d, &i ); sscanf_s( tokenstring, %f, &fp ); / Output the data read printf_s( String = %sn, s ); printf_s( Character = %cn, c ); printf_s( Integer: = %dn, i ); printf_s( Real: = %fn, fp ); return 0;例子2 (swscanf_s和wprintf_s,用于UNICODE编码):/ crt_swscanf_s.c/ This program uses swscanf_s to read data items/ from a string named tokenstring, then displays them. #include int main( void ) wchar_t tokenstring = L15 12 14.; wchar_t s81; wchar_t c; int i; float fp; / Input various data from tokenstring: / max 80 character string plus NULL terminator coutsizeof(wchar_t) _countof(s)endl; swscanf_s( tokenstring, L%s, s, _countof(s); swscanf_s( tokenstring, L%c, &c, sizeof(wchar_t) ); swscanf_s( tokenstring, L%d, &i ); swscanf_s( tokenstring, L%f, &fp ); / Output the data read wprintf_s( LString = %sn, s ); wprintf_s( LCharacter = %cn, c ); wprintf_s( LInteger: = %dn, i ); wprintf_s( LReal: = %fn, fp ); return 0;例子3 (_stscanf_s和_tprintf_s,将例1和例2的代码统一处理):#include int main( void ) TCHAR tokenstring = TEXT(15 12 14.); TCHAR s81; TCHAR c; int i; float fp; / Input various data from tokenstring: / max 80 character string plus NULL terminator coutsizeof(TCHAR) _countof(s)endl; _stscanf_s( tokenstring, TEXT(%s), s, _countof(s); _stscanf_s( tokenstring, TEXT(%c), &c, sizeof(TCHAR) ); _stscanf_s( tokenstring, TEXT(%d), &i ); _stscanf_s( tokenstring, TEXT(%f), &fp ); / Output the data read _tprintf_s( TEXT(String = %sn), s ); _tprintf_s( TEXT(Character = %cn), c ); _tprintf_s( TEXT(Integer: = %dn), i ); _tprintf_s( TEXT(Real: = %fn), fp ); return 0;例子4 (_stprintf_s ): TCHAR szText32 = 0; _stprintf_s(szText, 32,TEXT(%d),100); / 可以将int 型转化为宽字节 同时也可以将若干个变量整合为一个 _stprintf_s(szText, 32,TEXT(%d),char0, char1,.);用法总结:1. 用TCHAR代替char2. 用TEXT(“%s%d”)代替“%s%d”3. 用_stscanf_s、_tprintf_s、_stprintf_s代替sscanf、printf、sprintf函数。从而使程序能够在ANSI和UNICODE编码下都正确运行。二、细节内容1. %s %S %c %C 的区别。参考/en-us/library/hf4y5e3w(VS.71).aspx个人意见:尽量使用%s和%c,并统一使用TCHAR、TEXT和_stscanf_s、_tprintf_s、_stprintf_s类型的函数。尽量不要使用%S和%C,容易引起混淆,可移植性也不好。2. _TEXT(“”)、_T(“”)和TEXT(“”)的作用和区别。_T()是一个宏, 他的作用是让你的程序支持Unicode编码, 因为Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况, 而后者是双字节方式,方便处理双字节字符。_TEXT(“”)、_T(“”)和TEXT(“”)的作用是一样的。3. _T和_L的区别。_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。参考网页/14019890.html#ifdef UNICODE#define _TEXT(quote) L#quote#define _T(x) L#x#else#define _TEXT(quote) quote#define _T(x) x对于“#define _T(x) L#x”,这是相当晦涩的语法,但合乎ANSI C标准的前置处理器规范。那一对井字号称为粘贴符号(token paste),它将字母L添加到宏参数上。因此,如果宏参数是Hello!,则L#x就是LHello!。三、扩展部分: Unicode与字符串处理函数1. 通过对比学习“sprintf_s swprintf_s _stprintf_s”和“sscanf_s swscanf_s _stscanf_s”,可以明白它们的区别。还有很多与字符处理或字符串处理相关的函数,其形式和原理与之类似,可以对比学习和理解。例如:strlen、wcslen和_tcslen函数 (/zh-cn/library/78zh94ax(v=VS.80).aspx);fgets、fgetws与_fgetts函数 (/en-us/library/c37dh6kf(v=VS.71).aspx)TCHAR.H routine_UNICODE & _MBCS not defined_MBCS defined_UNICODE defined_tcslenstrlenstrlenwcslen_fgettsfgetsfgetsfgetws2. fgets、fgetws与_fgetts函数 (/en-us/library/c37dh6kf(v=VS.71).aspx)char * fgets ( char *string, int n, FILE *stream); /ANSI版本wchar_t *fgetws( wchar_t *string, int n, FILE *stream); /UNICODE版本 其中,第二个参数n的值是最多可以读出的字符数目,该值不应该大于参数一所对应的字符数组的长度。 函数的作用是从第三个参数指定的文件流中读取文件的一行信息,存放到参数一string所对应的字符数组中,读出的字符数据包括换行符“n”。这一点需要注意。 如果想从键盘读入一行字符,第三个参数为 stdin . 例如,char buf10; fgets(buf, 10, stdin); gets()函数已经过时了,用fgets()函数代替gets()函数。 _fgetts是一个宏,如果定义了UNICODE,就是fgetws函数;如果未定义UNICODE,就是fgets函数。 用TCHAR代替char,用_fgetts代替fgets或fgetws。就将ANSI和UNICODE函数编码统一起来了。对这两个函数的更具体的讲解,请参考http:/wenku.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论