寬字元型別和函式是c和c++標準(ansi/iso/iec c 1999和iso/iec c++ 1998/2003)新增加的內容,它們是用來支援國際通用的unicode(1993)字符集的。微軟公司從visual c++ 2005版起,開始嚴格執行c/c++的新標準。
安全crt函式是微軟公司對c/c++語言的擴充套件,其中的部分內容已於2023年提交給iso作為c/c++標準下一版本的修改建議。在vc05/08中,如果不使用這些安全性函式,編譯器會報告警告性錯誤。
1)常用的寬字元函式
由於windows nt/2000/xp採用的是unicode字元編碼,字元都是雙位元組的。所以在mfc程式設計中,一般需要使用雙位元組的字元型別wchar_t和對應的字串及其指標型別lpcwstr和lpctstr,並在常數字串前新增了l轉換符,串長計算函式不能用strlen而改用wcslen,串格式列印函式也不能用sprintf,而是改用swprintf(字元和串格式符也從%c和%s改為%lc和%ls)。
wchar_t型別,在標準c++中為內建的資料型別和關鍵字;在c99標準中則為typedef型別,其等價的資料型別與具體的實現有關,在win32和vc中定義為:
typedef unsigned short wchar_t; (雙位元組的無符號短整數)
下面是若干常用的寬字元函式(包含在iso c99 / iso c++的標準庫中):
#include
size_t wcslen(const wchar_t *s);
int wprintf(const wchar_t * format, ...);
int wscanf(const wchar_t * format, ...);
int swprintf(wchar_t * s, size_t n, const wchar_t * format, ...);
int swscanf(const wchar_t * s, const wchar_t * format, ...);
long int wcstol(const wchar_t * nptr, wchar_t ** endptr, int base);
float wcstof(const wchar_t * nptr, wchar_t ** endptr);
double wcstod(const wchar_t * nptr, wchar_t ** endptr);
#include
errno_t _itow_s( int value, wchar_t *buffer, size_t sizeincharacters, int radix );
errno_t _ultow_s( unsigned long value, wchar_t *str, size_t sizeofstr, int radix );
size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count );
size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );
2)常用的安全crt函式
安全crt(c runtime library = c執行時間庫)函式,是微軟公司對c/c++語言的擴充套件。它在原來函式名後新增了「_s」字尾;一般返回出錯**;並將原來的函式返回值,作為乙個引數,新增到函式輸入引數列表的最後;對帶緩衝區引數的函式,還新增了表示緩衝區大小的輸入引數,以防止記憶體溢位。
在vc05/08中,如果不使用這些安全性函式,編譯器會報告警告性錯誤。
下面是若干常用的安全crt函式:
char *gets_s( char *buffer, size_t sizeincharacters); //
wchar_t *_getws_s( wchar_t *buffer, size_t sizeincharacters); // or
errno_t _itoa_s( int value, char *buffer, size_t sizeincharacters, int radix ); //
errno_t _itow_s( int value, wchar_t *buffer, size_t sizeincharacters, int radix ); //
errno_t _ultoa_s( unsigned long value, char *str, size_t sizeofstr, int radix ); //
errno_t _ultow_s( unsigned long value, wchar_t *str, size_t sizeofstr, int radix ); //
int printf_s( const char *format [, argument]... ); //
int wprintf_s( const wchar_t *format [, argument]... ); // or
int scanf_s( const char *format [, argument]... ); //
int wscanf_s( const wchar_t *format [, argument]... ); // or
int sprintf_s( char *buffer, size_t sizeofbuffer, const char *format [, argument] ... ); //
int swprintf_s( wchar_t *buffer, size_t sizeofbuffer, const wchar_t *format [, argument]...); // or
int sscanf_s( const char *buffer, const char *format [, argument ] ...); //
int swscanf_s( const wchar_t *buffer, const wchar_t *format [, argument ] ...); // or
int fprintf_s( file *stream, const char *format [, argument ]...); //
int fwscanf_s( file *stream, const wchar_t *format [, argument ]... ); // or
int fscanf_s( file *stream, const char *format [, argument ]... ); //
int fwscanf_s( file *stream, const wchar_t *format [, argument ]... ); // or
errno_t strcpy_s( char *strdestination, size_t sizeinbytes, const char *strsource ); //
errno_t wcscpy_s( wchar_t *strdestination, size_t sizeinwords, const wchar_t *strsource ); // or
errno_t fopen_s( file** pfile, const char *filename, const char *mode ); //
errno_t _wfopen_s( file** pfile, const wchar_t *filename, const wchar_t *mode ); // or
errno_t mbstowcs_s( size_t *pconvertedchars, wchar_t *wcstr, size_t sizeinwords, const char *mbstr, size_t count ); //
errno_t wcstombs_s( size_t *pconvertedchars, char *mbstr, size_t sizeinbytes, const wchar_t *wcstr, size_t count ); //
errno_trand_s( unsigned int* randomvalue); //
下面是若干安全函式原型用到的資料型別的定義:
#include
typedef int errno_t;
typedef unsigned short wchar_t;
#ifdef_win64
typedef unsigned __int64 size_t;
#else
typedef _w64 unsigned int size_t;
#endif
Windows程式設計中的字元表示
unicode 它是用兩個位元組表示乙個字元的方法。比如字元 a 在ascii下面是乙個字元,可 a 在unicode下面是兩個字元,高字元用0填充,而且漢字 程 在ascii下面是兩個位元組,而在unicode下仍舊是兩個位元組 unicode的用處就是定長表示世界文字,據統計,用兩個位元組可以編...
Windows中的寬字串處理問題
在用vc做開發的時候,對於一些字串,會經常呼叫一般 t t t 其實這些東西都和unicode有關係。比如說,afxmessagebox t error fail to connect the database 這裡用到了乙個 t 不使用 t 有時候編譯會報錯。windows作業系統使用unicod...
Windows字符集 寬位元組(Unicode)
如果想讓多位元組轉為寬位元組,即在前面加大寫l,如 messagebox aaa messagebox l aaa 這樣就可以成功使用messagebox這個函式了,該函式大家應該都不陌生,就是mfc中的資訊顯示函式。下面介紹一些常用的字元轉換 統計多位元組字串的長度 int num 0 char ...