版权所有。转载请注明出处。
_stprintf_s_stscanf_s函数与UNICODE编码
一、核心内容
该文档适用于微软的visual C++ 平台。
需要头文件:<TCHAR.H>
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是为适应不同编码而定义的两个宏,在不同的编码环境下他们所表示的函数是不同的。
_ssecurity的意思,具体含义参见后面的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:输出的字符
          sizeOfBufferbuffer的长度,以能存放的字符数计算,而不是已占用的字节数计算。非常关键。一个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 ] ... );
函数具体细节参考msdn.microsoft/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, 定义宽字节类型方法如下:LABC,表示字符串“ABC”是用UNICODE编码的。
charwchar_t的区别: char中存放的是单字节型的字符,wchar_t中存放的是双字节型的字符,TCHAR在定义了_UNICODE时等同于wchar_t,在未定义_UNICODE时等同于char。
例子1 (sscanf_sprintf_s,用于ANSI编码)
// crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them.
#include <stdio.h>
int main( void )
{
  char  tokenstring[] = "15 ";
  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_swprintf_s用于UNICODE编码)
// crt_swscanf_s.c
// This program uses swscanf_s to read data items
// from a string named tokenstring, then displays them.
#include <stdio.h>unicode所有字符
int main( void )
{
  wchar_t  tokenstring[] = L"15 ";
  wchar_t  s[81];
  wchar_t  c;
  int  i;
  float fp;
  // Input various data from tokenstring:
  // max 80 character string plus NULL terminator
  cout<<sizeof(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( L"String    = %s\n", s );
  wprintf_s( L"Character = %c\n", c );
  wprintf_s( L"Integer:  = %d\n", i );
  wprintf_s( L"Real:    = %f\n", fp );
  return 0;
}
例子3 (_stscanf_s_tprintf_s将例1和例2的代码统一处理)
#include <stdio.h>
int main( void )
{
  TCHAR  tokenstring[] = TEXT("15 ");
  TCHAR  s[81];
  TCHAR  c;
  int  i;
  float fp;
  // Input various data from tokenstring:
  // max 80 character string plus NULL terminator
  cout<<sizeof(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    = %s\n"), s );
  _tprintf_s( TEXT("Character = %c\n"), c );
  _tprintf_s( TEXT("Integer:  = %d\n"), i );
  _tprintf_s( TEXT("Real:    = %f\n"), fp );
  return 0;
}
例子4  (_stprintf_s ):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。