亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

一些常見函數的內部實現(原)

系統 1918 0

一些常見函數的內部實現(原)

Wentao Sun

1. 子串查找:

/* ?strtok_s? */
/*
?*?strtok_s,?wcstok_s?;
?*?uses?_Context?to?keep?track?of?the?position?in?the?string.
?
*/
_SAFECRT__EXTERN_C
char ? * ?__cdecl?strtok_s( char ? * _String,? const ? char ? * _Control,? char ? ** _Context);

#if ?_SAFECRT_USE_INLINES

__inline
char ? * ?__cdecl?strtok_s( char ? * _String,? const ? char ? * _Control,? char ? ** _Context)
{
????unsigned?
char ? * str;
????
const ?unsigned? char ? * ctl? = ?( const ?unsigned? char ? * )_Control;
????unsigned?
char ?map[ 32 ];
????
int ?count;

????
/* ?validation?section? */
????_SAFECRT__VALIDATE_POINTER_ERROR_RETURN(_Context,?EINVAL,?NULL);
????_SAFECRT__VALIDATE_POINTER_ERROR_RETURN(_Control,?EINVAL,?NULL);
????_SAFECRT__VALIDATE_CONDITION_ERROR_RETURN(_String?!=?NULL?||?*_Context?!=?NULL,?EINVAL,?NULL);

???? /* ?Clear?control?map? */
????
for ?(count? = ? 0 ;?count? < ? 32 ;?count ++ )
????{
????????map[count]?
= ? 0 ;
????}

????
/* ?Set?bits?in?delimiter?table? */
????
do ?{
????????map[
* ctl? >> ? 3 ]? |= ?( 1 ? << ?( * ctl? & ? 7 ));
????}?
while ?( * ctl ++ );

????
/* ?If?string?is?NULL,?set?str?to?the?saved
????*?pointer?(i.e.,?continue?breaking?tokens?out?of?the?string
????*?from?the?last?strtok?call)?
*/
????
if ?(_String? != ?NULL)
????{
????????str?
= ?(unsigned? char ? * )_String;
????}
????
else
????{
????????str?
= ?(unsigned? char ? * ) * _Context;
????}

????
/* ?Find?beginning?of?token?(skip?over?leading?delimiters).?Note?that
????*?there?is?no?token?iff?this?loop?sets?str?to?point?to?the?terminal
????*?null?(*str?==?0)?
*/
????
while ?((map[ * str? >> ? 3 ]? & ?( 1 ? << ?( * str? & ? 7 )))? && ? * str? != ? 0 )
????{
????????str
++ ;
????}

????_String?
= ?( char ? * )str;

????
/* ?Find?the?end?of?the?token.?If?it?is?not?the?end?of?the?string,
????*?put?a?null?there.?
*/
????
for ?(?;? * str? != ? 0 ?;?str ++ ?)
????{
????????
if ?(map[ * str? >> ? 3 ]? & ?( 1 ? << ?( * str? & ? 7 )))
????????{
????????????
* str ++ ? = ? 0 ;
????????????
break ;
????????}
????}

????
/* ?Update?context? */
????
* _Context? = ?( char ? * )str;

????
/* ?Determine?if?a?token?has?been?found.? */
????
if ?(_String? == ?( char ? * )str)
????{
????????
return ?NULL;
????}
????
else
????{
????????
return ?_String;
????}
}
#endif

/* ?wcstok_s? */
_SAFECRT__EXTERN_C
wchar_t?
* ?__cdecl?wcstok_s(wchar_t? * _String,? const ?wchar_t? * _Control,?wchar_t? ** _Context);

#if ?_SAFECRT_USE_INLINES

__inline
wchar_t?
* ?__cdecl?wcstok_s(wchar_t? * _String,? const ?wchar_t? * _Control,?wchar_t? ** _Context)
{
????wchar_t?
* token;
????
const ?wchar_t? * ctl;

????
/* ?validation?section? */
????_SAFECRT__VALIDATE_POINTER_ERROR_RETURN(_Context,?EINVAL,?NULL);
????_SAFECRT__VALIDATE_POINTER_ERROR_RETURN(_Control,?EINVAL,?NULL);
????_SAFECRT__VALIDATE_CONDITION_ERROR_RETURN(_String?!=?NULL?||?*_Context?!=?NULL,?EINVAL,?NULL);


????
/* ?If?string==NULL,?continue?with?previous?string? */
????
if ?( ! _String)
????{
????????_String?
= ? * _Context;
????}

????
/* ?Find?beginning?of?token?(skip?over?leading?delimiters).?Note?that
????*?there?is?no?token?iff?this?loop?sets?string?to?point?to?the?terminal?null.?
*/
????
for ?(?;? * _String? != ? 0 ?;?_String ++ )
????{
????????
for ?(ctl? = ?_Control;? * ctl? != ? 0 ? && ? * ctl? != ? * _String;?ctl ++ )
????????????;
????????
if ?( * ctl? == ? 0 )
????????{
????????????
break ;
????????}
????}

????token?
= ?_String;

????
/* ?Find?the?end?of?the?token.?If?it?is?not?the?end?of?the?string,
????*?put?a?null?there.?
*/
????
for ?(?;? * _String? != ? 0 ?;?_String ++ )
????{
????????
for ?(ctl? = ?_Control;? * ctl? != ? 0 ? && ? * ctl? != ? * _String;?ctl ++ )
????????????;
????????
if ?( * ctl? != ? 0 )
????????{
????????????
* _String ++ ? = ? 0 ;
????????????
break ;
????????}
????}

????
/* ?Update?the?context? */
????
* _Context? = ?_String;

????
/* ?Determine?if?a?token?has?been?found.? */
????
if ?(token? == ?_String)
????{
????????
return ?NULL;
????}
????
else
????{
????????
return ?token;
????}
}
#endif

?

?2. 使用strsafe.h時需要注意將其放到其他string操作頭文件的后面,以免不必要的編譯錯誤。

可以參考: http://www.programfan.com/club/showtxt.asp?id=235904
我今天在編譯的適合也碰到過這個問題。

再次強調,使用strsafe.h最好是放在cpp文件中,而非頭文件中。

在微軟的tchar.h中明確的有個#error put strsafe.h behind thar.h。 strsafe.h被要求放在tchar.h的后面。如果不這樣,會得到一堆很奇怪的錯誤。

?

?

一些常見函數的內部實現(原)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久热福利视频 | 国产日产久久高清欧美一区 | 色综合色狠狠天天久久婷婷基地 | 亚洲国产成人久久综合一区77 | 亚洲欧美在线看 | www四虎在线高清 | 午夜影院一区二区三区 | 亚洲欧美日韩综合在线 | 一级毛片看看 | 五月天天色 | 久久国产精品只做精品 | 五月婷婷开心综合 | 日韩精品区 | 国产精品伦理 | 天天舔天天射 | 国产视频一区二区三区四区 | 亚洲国产成人久久午夜 | 日韩视频网 | 国产伦一区二区三区免费 | 久久伊人色综合 | 欧美一级高清片欧美国产欧美 | 在线精品亚洲欧洲第一页 | 天天操天天插天天干 | 天色噜噜噜噜 | 国产一区在线免费观看 | 97人人在线视频 | 999精品影视在线观看 | 欧美成人在线观看 | 毛片永久新网址首页 | 国产精品视频第一区二区三区 | 嫩小xxxxx性bbbbb孕妇 | 久久国产精品视频一区 | 亚洲国产中文字幕在线观看 | 美女视频黄视大全视频免费网址 | 日韩精品亚洲人成在线播放 | 成人午夜影视全部免费看 | 日韩字幕| 成 人 黄 色 视频 免费观看 | 99re8热精品免费视频 | 黄色伊人网 | a毛片在线还看免费网站 |