1日に1つのCRT関数_strdup
もうすぐ正月です.成都の天気はいいです.気持ちもいいです.
次にお話ししますstrdupは文字列をコピーするのによく使われる関数です.
1.紹介
関数署名:char*strdup(const char *strSrc)
戻り値:mallocによって割り当てられ、手動freeで解放される必要がある値を北にコピーした文字列のポインタを返します.
2.実現
ここで、tStrLenビットstrlenの実装、tStrCopysはstrcpy_sの実装、strcpy_sはMSが提供する関数であり、標準関数strncpyを借りている.これらの関数の実装は後述する文章で単独で紹介するが,ここでは用いただけで,省略する.
3.テスト
4.後記
この関数の設計はあまりよくないと思います.理由も簡単です.メモリを解放するのを忘れるかもしれません.ソリューションは、クライアントがメモリを申請し、パラメータで関数を入力することです.実は、ユーザーが文字列の中のメモリの分配の解放を考慮するのは良い設計ではありませんて、これも間接的にstd::stringを引き出して、自動的にメモリの生存を管理します.
次にお話ししますstrdupは文字列をコピーするのによく使われる関数です.
1.紹介
関数署名:char*strdup(const char *strSrc)
戻り値:mallocによって割り当てられ、手動freeで解放される必要がある値を北にコピーした文字列のポインタを返します.
2.実現
inline tChar *tStrDup(const tChar *pString)
{
tChar *pMemory = NULL;
size_t size = 0;
if( !pString )
return(NULL);
size = tStrLen(pString) + 1;
if( pMemory = static_cast(malloc(size)) )
{
tStrCopyS(pMemory, size, pString);
return pMemory;
}
return NULL;
}
ここで、tStrLenビットstrlenの実装、tStrCopysはstrcpy_sの実装、strcpy_sはMSが提供する関数であり、標準関数strncpyを借りている.これらの関数の実装は後述する文章で単独で紹介するが,ここでは用いただけで,省略する.
3.テスト
tChar seps[] = _T(" ,/t/n");
tChar *p = CY_CRT::tStrDup(seps);
wcout << p << endl;
free(p);
4.後記
この関数の設計はあまりよくないと思います.理由も簡単です.メモリを解放するのを忘れるかもしれません.ソリューションは、クライアントがメモリを申請し、パラメータで関数を入力することです.実は、ユーザーが文字列の中のメモリの分配の解放を考慮するのは良い設計ではありませんて、これも間接的にstd::stringを引き出して、自動的にメモリの生存を管理します.