Windows程式設計中寬字元函式和安全CRT函式

2021-05-23 20:11:57 字數 4173 閱讀 8912

寬字元型別和函式是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 ...