(精华版)_stprintf_s和_stscanf_s函数与UNICODE编码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

版权所有。转载请注明出处。

_stprintf_s和_stscanf_s函数与UNICODE编码

一、核心内容

⏹该文档适用于微软的visual C++ 平台。

⏹需要头文件:

⏹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 s[81];

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 = %s\n", s );

printf_s( "Character = %c\n", c );

printf_s( "Integer: = %d\n", i );

printf_s( "Real: = %f\n", fp );

return 0;

}

例子2 (swscanf_s和wprintf_s,用于UNICODE编码):

相关文档
最新文档