From 1b7c4543c81ee02ce84ef34c4582dec714b97c28 Mon Sep 17 00:00:00 2001 From: sauron Date: Wed, 8 Oct 2025 17:34:10 +0900 Subject: [PATCH] commit 2025-10-08 17:34 add ZCppMainTest/ZtCStringBase_000.cpp --- ZCppMain/ZMainHead.H | 7 + ZCppMain/ZtCStringEx.H | 1423 +++++++++++++++++++++++------------- ZCppMainTest/ZtCStringBase_000.cpp | 189 +++++ 3 files changed, 1115 insertions(+), 504 deletions(-) create mode 100644 ZCppMainTest/ZtCStringBase_000.cpp diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index d594ad1..aa203b0 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -7298,6 +7298,13 @@ namespace ZNsMain class ZtCChars /**#########################################*/ + typedef ZtCChars ZCChars ; + typedef ZtCChars ZCCharsW ; + + typedef ZtCChars ZCCharsView ; // for string_view in C++17 + typedef ZtCChars ZCCharsViewW; + + namespace ZNsView { diff --git a/ZCppMain/ZtCStringEx.H b/ZCppMain/ZtCStringEx.H index f6b4185..5d4978a 100644 --- a/ZCppMain/ZtCStringEx.H +++ b/ZCppMain/ZtCStringEx.H @@ -153,6 +153,7 @@ namespace ZNsMain ZtCMainChars ZCMainChars; public: typedef typename ZCTypeChars::ZCChars ZCChars ; + typedef typename ZCTypeChars::ZCChars ZCCharView; // for string_view in C++17 public: @@ -224,8 +225,6 @@ namespace ZNsMain namespace ZNsType*/ - template class ZtCHString; - /*///////////////////////////////////////////////////////////////// @@ -277,6 +276,8 @@ namespace ZNsMain typedef TTypeString ZCTypeString; typedef ZtCStringBase ZCStringBase; public: + typedef ZtCStringBase TypeBase ; + public: typedef typename ZCTypeString::ZCSearchInfo ZCSearchInfo ; typedef typename ZCTypeString::ZCSearchInfoList ZCSearchInfoList ; typedef typename ZCTypeString::ZCTypeChars ZCTypeChars ; @@ -285,16 +286,18 @@ namespace ZNsMain typedef typename ZCTypeString::TypeLong TypeSize ; typedef typename ZCTypeString::TypeLong TypeLength ; public: - typedef typename ZCTypeChars ::TypeChar TypeChar ; // TTypCh 과 같은 형이어야 한다. - typedef typename ZCTypeChars ::ZCChars ZCChars ; + typedef typename ZCTypeChars ::TypeChar TypeChar ; // TTypCh 과 같은 형이어야 한다. + typedef typename ZCTypeChars ::ZCChars ZCChars ; + typedef typename ZCTypeChars ::ZCChars ZCCharView ; // // for string_view in C++17 + public: + typedef const ZCChars ZCCharsC ; + typedef const ZCChars ZCCharViewC; public: typedef TypeChar TypeData ; public: typedef TAlloc TypeAlloc ; typedef ZCStringList TypeList ; public: - friend class ZtCHString; - public: enum EWriteFile // WriteFile() 에서 사용한다. { @@ -356,6 +359,22 @@ namespace ZNsMain ##########################################################*/ + template void FindPosToList ///////////// + ( + TPosList& ARR_CPosList, const ZCCharView& AR_CCharView, TypeLength AL_Offset=0 + ) + /*########################################################*/ + { + FindPosToList + ( ARR_CPosList, AR_CCharView.data(), AR_CCharView.size(), AL_Offset ); + }/* + template void FindPosToList ///////////// + ( + TPosList& ARR_CPosList, const ZCCharView& AR_CCharView, TypeLength AL_Offset=0 + ) + ##########################################################*/ + + /*////////////////////////////////////////////////////////// ■ -- 2025-09-19 20:11 @@ -612,7 +631,7 @@ namespace ZNsMain TSearchInfoList& ARR_InfoList, TypeCharC* APC_Search , TypeLength AL_SearchLen, - TypeLength AL_StartPos + TypeLength AL_StartPos=0 ) ///////////////////////////////////////////////////////// { @@ -673,12 +692,28 @@ namespace ZNsMain TSearchInfoList& ARR_InfoList, TypeCharC* APC_Search , TypeLength AL_SearchLen, - TypeLength AL_StartPos + TypeLength AL_StartPos=0 ) ///////////////////////////////////////////////////////*/ - /*public :*/ + template void MakeSplitInfoList + ( + TSearchInfoList& ARR_InfoList, + ZCCharViewC & AR_CCharView, + TypeLength AL_StartPos=0 + ) + ///////////////////////////////////////////////////////// + { + MakeSplitInfoList + ( + RR(ARR_InfoList) , AR_CCharView.data(), + AR_CCharView,size(), AL_StartPos + ); + } + ///////////////////////////////////////////////////////// + + /*public : /*++++++++++++++++++++++++++++++++++++++++++++++*/ protected: TypeLength ml_AllLen; TypeLength ml_UseLen; @@ -731,7 +766,17 @@ namespace ZNsMain }/* ZtCStringBase(const ZtCStringBase& rhs)*/ - ZtCStringBase(TypeLength AL_Long) + ZtCStringBase(const ZCCharView& AR_View) + { + ml_AllLen=0; + ml_UseLen=0; + mpc_Data =0; + + MakeWord(AR_View.data(), AR_View.size()); + }/* + ZtCStringBase(const ZCCharView& AR_View)*/ + + explicit ZtCStringBase(TypeLength AL_Long) { ml_AllLen=0; ml_UseLen=0; @@ -739,7 +784,7 @@ namespace ZNsMain (*this)(AL_Long); }/* - ZtCStringBase(TypeLength AL_Long)*/ + explicit ZtCStringBase(TypeLength AL_Long)*/ ~ZtCStringBase() { @@ -951,7 +996,8 @@ namespace ZNsMain }/* ZCStringBase& append(const ZCStringBase& rhs, TypeLength AL_LoopCnt)*/ - // STL 의 string 멤버함수와 이름을 맞추기 위한 함수 끝 + ZCStringBase& append(const ZCCharView& AR_View) + { return append(AR_View.data(), AR_View.size()); } TypeLength MemCopy /*##########################################################*/ @@ -1041,7 +1087,7 @@ namespace ZNsMain }/* ZCStringBase& InvalidByForce(TypeLength AL_Index=0)*/ - ZCStringBase& InvalidateSearch( + ZCStringBase& InvalidSearch( TypeCharC* APC_Search, TypeLength AL_SearchLen, TypeLength AL_Index=0) { // APC_Search 를 찾아서 그 부분을 무효화시킨다. @@ -1054,10 +1100,17 @@ namespace ZNsMain return *this; }/* - ZCStringBase& InvalidateSearch( + ZCStringBase& InvalidSearch( TypeCharC* APC_Search, TypeLength AL_SearchLen, TypeLength AL_Index=0)*/ - ZCStringBase& InvalidateSearchFromEnd( + ZCStringBase& InvalidSearch(const ZCCharView& AR_View, TypeLength AL_Index=0) + { + return InvalidSearch(AR_View.data(), AR_View.size(), AL_Index); + }/* + ZCStringBase& InvalidSearch(const ZCCharView& AR_View, TypeLength AL_Index=0)*/ + + + ZCStringBase& InvalidSearchFromEnd( TypeCharC* APC_Search, TypeLength AL_SearchLen, TypeLength AL_StartPos) { // APC_Search 를 뒤로부터 찾아서 그 부분을 무효화시킨다. @@ -1073,10 +1126,19 @@ namespace ZNsMain return *this; }/* - ZCStringBase& InvalidateSearchFromEnd( + ZCStringBase& InvalidSearchFromEnd( TypeCharC* APC_Search, TypeLength AL_SearchLen, TypeLength AL_StartPos)*/ - ZCStringBase& InvalidateSearchFromEnd + ZCStringBase& InvalidSearchFromEnd( + const ZCCharView& AR_View, TypeLength AL_StartPos) + { + return InvalidSearchFromEnd(AR_View.data(), AR_View.size(), AL_StartPos); + }/* + ZCStringBase& InvalidSearchFromEnd( + const ZCCharView& AR_View, TypeLength AL_StartPos)*/ + + + ZCStringBase& InvalidSearchFromEnd ( TypeCharC* APC_Search, TypeLength AL_SearchLen ) @@ -1086,17 +1148,24 @@ namespace ZNsMain if(ml_UseLen<1) return *this; - return InvalidateSearchFromEnd + return InvalidSearchFromEnd ( APC_Search, AL_SearchLen, ml_UseLen-1 ); /*<<<<<<<<<<<<<<<<<<<<<<<<<<*/ }/* - ZCStringBase& InvalidateSearchFromEnd + ZCStringBase& InvalidSearchFromEnd ( TypeCharC* APC_Search, TypeLength AL_SearchLen ) - /*#################################*/ + /*###############################*/ + + ZCStringBase& InvalidSearchFromEnd(const ZCCharView& AR_View) + { + return InvalidSearchFromEnd(AR_View.data(), AR_View.size()); + }/* + ZCStringBase& InvalidSearchFromEnd(const ZCCharView& AR_View)*/ + ZCStringBase& InvalidHead(TypeCharC* APC_Search, TypeLength AL_SearchLen) { @@ -1120,17 +1189,23 @@ namespace ZNsMain }/* ZCStringBase& InvalidHead(TypeCharC* APC_Search)*/ + ZCStringBase& InvalidHead(const ZCCharView& AR_View) + { + return InvalidHead(AR_View.data(), AR_View.size()); + }/* + ZCStringBase& InvalidHead(const ZCCharView& AR_View)*/ - /*//////////////////////////////////////////// - // 가끔 오류가 나는 경우가 있어서 주석처리한다. + /*////////////////////////////////////////////// + + // 가끔 오류가 나는 경우가 있어서 주석 처리한다. ZCStringBase* operator->() { // 이 멤버를 호출하면 어떤 경우에도 // 문자열 포인터는 NULL 이 아니다. - static char SA_Char[1]=""; + static char SA_Char[1] = ""; if(ml_AllLen<1) mpc_Data=SA_Char; @@ -1138,7 +1213,7 @@ namespace ZNsMain return this; } - ////////////////////////////////////////////*/ + //////////////////////////////////////////////*/ ZCStringBase& operator=(const ZCStringBase& rhs) @@ -1173,22 +1248,16 @@ namespace ZNsMain }/* ZCStringBase& operator=(TypeCharC* APC_Data)*/ - ZCStringBase& operator=(const ZCChars& AR_CChars) + ZCStringBase& operator=(const ZCCharView& AR_View) { - Invalidate(); return (*this)(AR_CChars.data(), AR_CChars.size()); + Invalidate(); return (*this)(AR_View.data(), AR_View.size()); }/* - ZCStringBase& operator=(const ZCChars& AR_CChars)*/ + ZCStringBase& operator=(const ZCCharView& AR_View)*/ ZCStringBase& operator=(int AI_Int ){Invalidate(); return (*this)(AI_Int );} ZCStringBase& operator=(long AL_Long ){Invalidate(); return (*this)(AL_Long );} ZCStringBase& operator=(double AD_Double){Invalidate(); return (*this)(AD_Double);} - ZCStringBase& operator=(const std::string& AR_CString) - { - return this->MakeWord(AR_CString.c_str(), AR_CString.size()); - }/* - ZCStringBase& operator=(const std::string& AR_CString)*/ - bool operator==(TypeCharC* APC_Data) const{return Minus(APC_Data)==0 ;} bool operator!=(TypeCharC* APC_Data) const{return Minus(APC_Data)!=0 ;} @@ -1226,6 +1295,20 @@ namespace ZNsMain }/* ZCStringBase operator+(TypeCharC* APC_Data)*/ + ZCStringBase operator+(const ZCCharView& AR_View) + { + ZCStringBase VO_CStringTemp; + + VO_CStringTemp.ReAlloc + ( ml_UseLen+AR_View.size() ); + VO_CStringTemp(*this) + ( AR_View.data(), AR_View.size() ); + + return VO_CStringTemp; + }/* + ZCStringBase operator+(const ZCCharView& AR_View)*/ + + ZCStringBase& operator+=(TypeCharC* APC_Data) { return (*this)(APC_Data); @@ -1238,6 +1321,13 @@ namespace ZNsMain }/* ZCStringBase& operator+=(const ZCStringBase& rhs)*/ + ZCStringBase& operator+=(const ZCCharView& AR_View) + { + return (*this)(AR_View.data(), AR_View.size()); + }/* + ZCStringBase& operator+=(const ZCCharView& AR_View)*/ + + TypeChar& operator[](TypeLength AL_Index) { return mpc_Data[AL_Index] ; @@ -1250,12 +1340,12 @@ namespace ZNsMain }/* const TypeChar& operator[](TypeLength AL_Index) const*/ + ZCStringBase& operator-(const ZCStringBase& rhs) { - if(this->DoStart(rhs.c_str(), rhs.size())==true) + if(this->DoStart(rhs.data(), rhs.size())) MoveFirst(rhs.size()); - - return *this; ////////////////////////////////// + return *this; /////////////////////////// }/* ZCStringBase& operator-(const ZCStringBase& rhs)*/ @@ -1263,38 +1353,68 @@ namespace ZNsMain { TypeLength VL_Length = GetLength(APC_Data) ; - if(this->DoStart(APC_Data, VL_Length)==true) + if(this->DoStart(APC_Data, VL_Length)) MoveFirst(VL_Length); - - return *this; ////////////////////////////// + return *this; //////////////////////// }/* ZCStringBase& operator-(TypeCharC* APC_Data)*/ + ZCStringBase& operator-(const ZCCharView& AR_View) + { + if(this->DoStart(AR_View.data(), AR_View.size())) + MoveFirst(AR_View.size()); + return *this; /////////////////////////////////// + }/* + ZCStringBase& operator-(const ZCCharView& AR_View)*/ + + ZCStringBase& operator-=(TypeCharC* APC_Data) { TypeLength VL_Length = GetLength(APC_Data) ; - if(this->DoStart(APC_Data, VL_Length)==true) + if(this->DoStart(APC_Data, VL_Length)) MoveFirst(VL_Length); - return *this; ////////////////////////////// + return *this; //////////////////////// }/* ZCStringBase& operator-=(TypeCharC* APC_Data)*/ + ZCStringBase& operator-=(const ZCCharView& AR_View) + { + if(this->DoStart(AR_View.data(), AR_View.size())) + MoveFirst(AR_View.size()); + return *this; /////////////////////////////////// + }/* + ZCStringBase& operator-=(const ZCCharView& AR_View)*/ + + bool IsEqual(TypeCharC* APC_Data, TypeLength AL_Length) const { - return Minus(data(), APC_Data,size(), AL_Length)==0; + return TypeBase::Minus(data(), APC_Data, size(), AL_Length)==0; }/* bool IsEqual(TypeCharC* APC_Data, TypeLength AL_Length) const*/ + bool IsEqual(const ZCCharView& AR_View) const + { + return IsEqual(AR_View.data(), AR_View.size()); + }/* + bool IsEqual(const ZCCharView& AR_View) const*/ + + ZCStringBase& Minus(TypeCharC* APC_Data, TypeLength AL_Length) { - if(this->DoStart(APC_Data, AL_Length)==true) MoveFirst(AL_Length); - - return *this; /*++++++++++++++++++++++++++++++++++++++++++++++++*/ + if(this->DoStart(APC_Data, AL_Length)) + { MoveFirst( AL_Length ); } + return *this; /*++++++++++++++++++++*/ }/* ZCStringBase& Minus(TypeCharC* APC_Data, TypeLength AL_Length)*/ + ZCStringBase& Minus(const ZCCharView& AR_View) + { + return Minus(AR_View.data(), AR_View.size()); + }/* + ZCStringBase& Minus(const ZCCharView& AR_View)*/ + ZCStringBase& Reverse() { @@ -1346,6 +1466,12 @@ namespace ZNsMain }/* ZCStringBase& MakeWord(TypeCharC* APC_Data, TypeLength AL_Length)*/ + ZCStringBase& MakeWord(const ZCCharView& AR_View) + { + return MakeWord(AR_View.data(), AR_View.size()); + }/* + ZCStringBase& MakeWord(const ZCCharView& AR_View)*/ + ZCStringBase& operator()(TypeCharC* APC_Data, TypeLength AL_Length) { @@ -1515,7 +1641,7 @@ namespace ZNsMain ); /////////////////////////////////// - CorrectLength(ml_UseLen); return *this; + InvalidNull(ml_UseLen); return *this; }/* ZCStringBase& operator()( TypeLength AL_AddSize, TypeCharC* APC_Format, ...)*/ @@ -1529,7 +1655,7 @@ namespace ZNsMain template ZCStringBase& AddObject(TObject& AR_CObject) */ - ZCStringBase& CorrectLength(TypeLength AL_StartPos=0) + ZCStringBase& InvalidNull(TypeLength AL_StartPos=0) { if(AL_StartPos<0 ) AL_StartPos=0; @@ -1543,7 +1669,7 @@ namespace ZNsMain ml_UseLen=AL_StartPos-1; return *this; }/* - ZCStringBase& CorrectLength(TypeLength AL_StartPos=0)*/ + ZCStringBase& InvalidNull(TypeLength AL_StartPos=0)*/ TypeLength ReadLongFromIndex(TypeLength AL_Index1, TypeLength AL_Index2) @@ -1599,11 +1725,9 @@ namespace ZNsMain }/* TypeLength ReadLong(TypeLength AL_Index)*/ - TypeLength ReadLong /*#########################################################*/ + TypeLength ReadLong /*/////////////////////////////////////////////////////////*/ ( - TypeLength AL_Index , - TypeCharC* APC_Search , - TypeLength AL_SearchLen + TypeLength AL_Index, TypeCharC* APC_Search, TypeLength AL_SearchLen ) /*#############################################################################*/ { @@ -1616,42 +1740,47 @@ namespace ZNsMain TypeLength VL_Pos = FindPos (APC_Search, AL_SearchLen, AL_Index); - if(VL_Pos==AL_Index) return 0; + if(VL_Pos==AL_Index) return 0 ; if(VL_Pos<0) VL_Pos=ml_UseLen-1; return ReadLongFromIndex(AL_Index, VL_Pos-1); }/* - TypeLength ReadLong /*########################################################### + TypeLength ReadLong ///////////////////////////////////////////////////////////// ( - TypeLength AL_Index , - TypeCharC* APC_Search , - TypeLength AL_SearchLen + TypeLength AL_Index, TypeCharC* APC_Search, TypeLength AL_SearchLen ) /*#############################################################################*/ - ZCStringBase& ReadString( - ZCStringBase& ARR_CString, TypeLength AL_Index1, TypeLength AL_Index2) + TypeLength ReadLong(TypeLength AL_Index, const ZCCharView& AR_View) { - // Index1 번째 문자부터 VL_Index2 문자까지를 ARR_CString 에 전달한다. - - return ARR_CString(mpc_Data+AL_Index1, AL_Index2-AL_Index1+1); + return ReadLong(AL_Index, AR_View.data(), AR_View.size()); }/* - ZCStringBase& ReadString( - ZCStringBase& ARR_CString, TypeLength AL_Index1, TypeLength AL_Index2)*/ + TypeLength ReadLong(TypeLength AL_Index, const ZCCharView& AR_View)*/ + + + ZCStringBase& ReadCStr( + ZCStringBase& ARR_Rhs, TypeLength AL_Index1, TypeLength AL_Index2) + { + // Index1 번째 문자부터 VL_Index2 문자까지를 ARR_Rhs 에 전달한다. + + return ARR_Rhs(mpc_Data+AL_Index1, AL_Index2-AL_Index1+1); + }/* + ZCStringBase& ReadCStr( + ZCStringBase& ARR_Rhs, TypeLength AL_Index1, TypeLength AL_Index2)*/ ZCStringBase& ReadString_E /*##################################################*/ ( - ZCStringBase& ARR_CString , - TypeLength AL_Index1 , + ZCStringBase& ARR_Rhs , + TypeLength AL_Index1 , TypeLength AL_Index2 ) /*#############################################################################*/ { - // Index1 번째 문자부터 VL_Index2 문자까지를 ARR_CString 에 전달한다. - // ReadString 과는 달리 에러검사를 한다. + // Index1 번째 문자부터 VL_Index2 문자까지를 ARR_Rhs 에 전달한다. + // ReadCStr 과는 달리 에러검사를 한다. const bool CB_IsTrue = /*////////////////////////*/ ( @@ -1661,61 +1790,72 @@ namespace ZNsMain ); /*///////////////////////////////////////////////*/ - if(CB_IsTrue) return ARR_CString; return + if(CB_IsTrue) return ARR_Rhs; return - ARR_CString( mpc_Data+AL_Index1, AL_Index2-AL_Index1+1 ); + ARR_Rhs( mpc_Data+AL_Index1, AL_Index2-AL_Index1+1 ); }/* ZCStringBase& ReadString_E ###################################################### ( - ZCStringBase& ARR_CString , - TypeLength AL_Index1 , + ZCStringBase& ARR_Rhs , + TypeLength AL_Index1 , TypeLength AL_Index2 ) /*#############################################################################*/ - ZCStringBase& ReadString //////////////////////// + ZCStringBase& ReadCStr ////////////////////////// ( - ZCStringBase& ARR_CString, - TypeLength AL_Index , - TypeCharC* APC_Search , + ZCStringBase& ARR_Rhs , + TypeLength AL_Index , + TypeCharC* APC_Search , TypeLength AL_SearchLen ) /*/////////////////////////////////////////////*/ { - // AL_Index 번째 문자부터 APC_Search 문자를 찾아서 그 앞부분까지 ARR_CString 에 전달한다. + // AL_Index 번째 문자부터 APC_Search 문자를 찾아서 그 앞부분까지 ARR_Rhs 에 전달한다. - if(AL_Index>=ml_UseLen) return ARR_CString; + if(AL_Index>=ml_UseLen) return ARR_Rhs; TypeLength VL_Pos = FindPos (APC_Search, AL_SearchLen, AL_Index); - if(VL_Pos==AL_Index) return ARR_CString; + if(VL_Pos==AL_Index) return ARR_Rhs; if(VL_Pos<0) VL_Pos = ml_UseLen-1; else VL_Pos-- ; - return ReadString - (ARR_CString, AL_Index, VL_Pos); + return ReadCStr + (ARR_Rhs, AL_Index, VL_Pos); }/* - ZCStringBase& ReadString //////////////////////// + ZCStringBase& ReadCStr ////////////////////////// ( - ZCStringBase& ARR_CString, - TypeLength AL_Index , - TypeCharC* APC_Search , + ZCStringBase& ARR_Rhs , + TypeLength AL_Index , + TypeCharC* APC_Search , TypeLength AL_SearchLen ) ///////////////////////////////////////////////*/ + ZCStringBase& ReadCStr ////////////////////////// + ( + ZCStringBase& ARR_Rhs, ZCCharViewC& AR_View, TypeLength AL_SearchLen + ) + /*/////////////////////////////////////////////*/ + { + return ReadCStr(ARR_Rhs, AR_View.data(), AR_View.size()); + } + /*/////////////////////////////////////////////*/ + + // AL_Index 번째 부터 끝문자까지의 데이타를 가져온다. - ZCStringBase& ReadStrToEnd(ZCStringBase& ARR_CString, TypeLength AL_Index) + ZCStringBase& ReadStrToEnd(ZCStringBase& ARR_Rhs, TypeLength AL_Index) { - return ReadString(RR(ARR_CString), AL_Index, ml_UseLen-1); + return ReadCStr(RR(ARR_Rhs), AL_Index, ml_UseLen-1); }/* - ZCStringBase& ReadStrToEnd(ZCStringBase& ARR_CString, TypeLength AL_Index)*/ + ZCStringBase& ReadStrToEnd(ZCStringBase& ARR_Rhs, TypeLength AL_Index)*/ bool IsEmpty() const @@ -1755,7 +1895,7 @@ namespace ZNsMain va_start(VP_VarParam, APC_Format); vsprintf(mpc_Data, APC_Format, VP_VarParam); - CorrectLength(); return *this; + InvalidNull(); return *this; }/* ZCStringBase& Format(TypeCharC* APC_Format, ...)*/ @@ -1769,12 +1909,12 @@ namespace ZNsMain va_start( VP_VarParam, APC_Format); vsprintf(mpc_Data+ml_UseLen, APC_Format, VP_VarParam); - CorrectLength(ml_UseLen); return *this; + InvalidNull(ml_UseLen); return *this; }/* ZCStringBase& FormatAdd(TypeLength AL_FormatSize, TypeCharC* APC_Format, ...)*/ - ZCStringBase& ReplaceChar /*###################################################*/ + ZCStringBase& ReplaceChar /*///////////////////////////////////////////////////*/ ( TypeChar AC_SearchChar, TypeChar AC_ReplaceChar, TypeLength AI_StartPos=0 ) @@ -1788,14 +1928,14 @@ namespace ZNsMain return *this; }/* - ZCStringBase& ReplaceChar ####################################################### + ZCStringBase& ReplaceChar /////////////////////////////////////////////////////// ( TypeChar AC_SearchChar, TypeChar AC_ReplaceChar, TypeLength AI_StartPos=0 ) /*#############################################################################*/ - ZCStringBase& ReplaceOnce /*###################################################*/ + ZCStringBase& ReplaceOnce /*///////////////////////////////////////////////////*/ ( TypeCharC* APC_Search , TypeCharC* APC_Replace , TypeLength AL_SearchLen, TypeLength AL_ReplaceLen, @@ -1815,7 +1955,7 @@ namespace ZNsMain ); //////////////////////////////////// }/* - ZCStringBase& ReplaceOnce ####################################################### + ZCStringBase& ReplaceOnce /////////////////////////////////////////////////////// ( TypeCharC* APC_Search , TypeCharC* APC_Replace , TypeLength AL_SearchLen, TypeLength AL_ReplaceLen, @@ -1823,6 +1963,18 @@ namespace ZNsMain ) /*#############################################################################*/ + ZCStringBase& ReplaceOnce /*///////////////////////////////////////////////////*/ + ( + ZCCharView& AR_Search, const ZCCharView& AR_Replace, TypeLength AL_StartPos=0 + ) + /*#############################################################################*/ + { + return ReplaceOnce + (AR_Search.data(), AR_Replace.data(), AR_Search.size(), AR_Replace.size(), AL_StartPos); + } + /*#############################################################################*/ + + ZCStringBase& ReplaceOnce( TypeCharC* APC_Search, TypeCharC* APC_Replace, TypeLength AL_StartPos=0) { @@ -1906,19 +2058,31 @@ namespace ZNsMain AR_CStrReplace.size(), AL_StartPos /*/////////*/ ); //////////////////////////// - }/* - ZCStringBase& Replace /////////////////////////////////////////////////////////// + } + /*#############################################################################*/ + + + ZCStringBase& Replace /*///////////////////////////////////////////////////////*/ ( - const ZCStringBase& AR_CStrSearch , - const ZCStringBase& AR_CStrReplace, - TypeLength AL_StartPos=0 + const ZCCharView& AR_CStrSearch , + const ZCCharView& AR_CStrReplace, + TypeLength AL_StartPos=0 ) /*#############################################################################*/ + { + return Replace( AR_CStrSearch. data(), ////// + AR_CStrReplace.data(), + AR_CStrSearch. size(), + AR_CStrReplace.size(), + AL_StartPos + /*/////////*/ ); //////////////////////////// + } + /*#############################################################################*/ static ZCStringBase& ReplaceSection /*#########################################*/ ( - ZCStringBase& ARR_Saver , + ZCStringBase& ARR_Rhs , TypeCharC* APC_Origin , TypeLength AL_SectPos , // APC_Origin 의 특정위치 TypeLength AL_SectLen , @@ -1929,10 +2093,10 @@ namespace ZNsMain /*#############################################################################*/ { // APC_Origin 의 AL_SectPos 부터 AL_SectLen 개의 문자를 - // APC_Replace 로 바꾸어서 ARR_Saver 에 저장한다. + // APC_Replace 로 바꾸어서 ARR_Rhs 에 저장한다. if(AL_SectLen<1 || AL_OriginLen<1) - { return ARR_Saver; } + { return ARR_Rhs ; } if(AL_ReplaceLen<0) { AL_ReplaceLen=0 ; } @@ -1940,22 +2104,22 @@ namespace ZNsMain // 아래 if 문에 대해서는 ReplaceFromInfoList() 를 참고 - if(ARR_Saver.data()==APC_Origin) + if(ARR_Rhs.data()==APC_Origin) { - ARR_Saver.ReAllocKeep( + ARR_Rhs.ReAllocKeep( VL_AllMemSize=AL_OriginLen+AL_ReplaceLen-AL_SectLen); - TypeChar* VPC_Origin2=ARR_Saver.data(); + TypeChar* VPC_Origin2=ARR_Rhs.data(); if(AL_ReplaceLen>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ for(int j=AL_SectPos+AL_SectLen; j>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - ARR_Saver.data()[VL_AllMemSize]=0; - ARR_Saver.CorrectLength(VL_AllMemSize-1); + ARR_Rhs.data()[VL_AllMemSize]=0; + ARR_Rhs.InvalidNull(VL_AllMemSize-1); - return ARR_Saver; + return ARR_Rhs; } else // AL_ReplaceLen>=AL_SectLen { TypeLength VL_NowIndex=AL_OriginLen-1 ; - TypeChar* VPC_Dest =ARR_Saver.data()+VL_AllMemSize-1; + TypeChar* VPC_Dest =ARR_Rhs.data()+VL_AllMemSize-1; while(VL_NowIndex>=AL_SectPos+AL_SectLen) { @@ -1985,25 +2149,25 @@ namespace ZNsMain }/* ///////////////////////////////////*/ - ARR_Saver.data()[VL_AllMemSize]=0; - ARR_Saver.CorrectLength(VL_AllMemSize-1); + ARR_Rhs.data()[VL_AllMemSize]=0; + ARR_Rhs.InvalidNull(VL_AllMemSize-1); - return ARR_Saver; + return ARR_Rhs; }/* else // AL_ReplaceLen>=AL_SectLen*/ }/* - if(ARR_Saver.data()==APC_Origin)*/ + if(ARR_Rhs.data()==APC_Origin)*/ - ARR_Saver.ReAllocKeep + ARR_Rhs.ReAllocKeep ( - VL_AllMemSize += ARR_Saver.size() + + VL_AllMemSize += ARR_Rhs.size() + AL_OriginLen + AL_ReplaceLen - AL_SectLen ); ///////////////////// TypeLength VL_NowIndex=AL_OriginLen-1 ; - TypeChar* VPC_Dest =ARR_Saver.data()+VL_AllMemSize-1; + TypeChar* VPC_Dest =ARR_Rhs.data()+VL_AllMemSize-1; while(VL_NowIndex>=AL_SectPos+AL_SectLen) { @@ -2023,14 +2187,14 @@ namespace ZNsMain }/* /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - ARR_Saver.data()[VL_AllMemSize]=0; - ARR_Saver.CorrectLength(VL_AllMemSize-1); + ARR_Rhs.data()[VL_AllMemSize]=0; + ARR_Rhs.InvalidNull(VL_AllMemSize-1); - return ARR_Saver; + return ARR_Rhs; }/* static ZCStringBase& ReplaceSection ############################################# ( - ZCStringBase& ARR_Saver , + ZCStringBase& ARR_Rhs , TypeCharC* APC_Origin , TypeLength AL_SectPos , TypeLength AL_SectLen , @@ -2040,15 +2204,17 @@ namespace ZNsMain ) ###############################################################################*/ - static ZCStringBase& ReplaceSection( //////////////////////////////////////////// - ZCStringBase& ARR_Saver , - TypeCharC* APC_Origin , - TypeLength AL_SectPos , // APC_Origin의 특정위치 - TypeLength AL_SectLen , - TypeCharC* APC_Replace - /*/////////*/ ) //////////////////////////////////////////////////////////////// + static ZCStringBase& ReplaceSection /*/////////////////////////////////////////*/ + ( + ZCStringBase& ARR_Rhs , + TypeCharC* APC_Origin , + TypeLength AL_SectPos , // APC_Origin의 특정위치 + TypeLength AL_SectLen , + TypeCharC* APC_Replace + ) + /*############################################################################*/ { - return ReplaceSection( ARR_Saver , ////////////////////////////////////// + return ReplaceSection( ARR_Rhs , ////////////////////////////////////// APC_Origin , AL_SectPos , AL_SectLen , @@ -2056,19 +2222,38 @@ namespace ZNsMain GetLength(APC_Origin ), GetLength(APC_Replace) /*////////////////*/ ) ; - }/* - static ZCStringBase& ReplaceSection( //////////////////////////////////////////// - ZCStringBase& ARR_Saver , - TypeCharC* APC_Origin, - TypeLength AL_SectPos, // APC_Origin의 특정위치 - TypeLength AL_SectLen, - TypeCharC* APC_Replace - ///////////// ) /////////////////////////////////////////////////////////////*/ + } + /*############################################################################*/ + + static ZCStringBase& ReplaceSection /*/////////////////////////////////////////*/ + ( + ZCStringBase& ARR_Rhs , + ZCCharViewC& AR_Origin , + TypeLength AL_SectPos , + TypeLength AL_SectLen , + ZCCharViewC& AR_Replace + ) + /*############################################################################*/ + { + return ReplaceSection /////////////// + ( + ARR_Rhs , + AR_Origin.data() , + AL_SectPos , + AL_SectLen , + AR_Replace.data() , + AR_Origin .size() , + AR_Replace.size() + ) ; + ///////////////////////////////////// + } + /*############################################################################*/ + // TSearchInfoList 은 class ZCSearchInfo 의 리스트 - template ZCStringBase& ReplaceFromInfoList /*########*/ + template ZCStringBase& ReplaceFromInfoList /*#######*/ ( TSearchInfoList& AR_InfoList , TypeCharC* APC_Origin , @@ -2076,9 +2261,9 @@ namespace ZNsMain TypeLength AL_OriginLen , TypeLength AL_ReplaceLen ) - /*#############################################################################*/ + /*############################################################################*/ { - // APC_Origin문자열을 어떤 기준에 적합한 부문자열 정보가 AR_InfoList + // APC_Origi n문자열을 어떤 기준에 적합한 부문자열 정보가 AR_InfoList // 에 있고, 이 정보를 토대로 부문자열을 APC_Replace로 바꾼다. IterEasyID VI_InfoIter =AR_InfoList.GetTailIterEasyID(); @@ -2091,9 +2276,9 @@ namespace ZNsMain /*/////////////////////////////////////////////////////////////////////////////////////////////// - ■ this 의 내부버퍼가 APC_Origin일 때 수행할 수 있게 한다. 만일 + ■ this 의 내부버퍼가 APC_Origin 일 때 수행할 수 있게 한다. 만일 - APC_Origin==ARR_StringReplace.c_str() + APC_Origin==ARR_StringReplace.data() 인 경우에, ARR_StringReplace 이 새로운 메모리를 할당하면서 APC_Origin의 값이 바뀔 수 있으므로 다시 초기화하는 코드가 필요하다. 이때 ZtCStringBase::ReplaceSection() 함수와는 달리, 메모리를 @@ -2149,7 +2334,7 @@ namespace ZNsMain mpc_Data[ml_UseLen=VL_AllMemCnt]=0; return *this; }/* - template ZCStringBase& ReplaceFromInfoList ########### + template ZCStringBase& ReplaceFromInfoList ########## ( TSearchInfoList& AR_InfoList , TypeCharC* APC_Origin , @@ -2157,15 +2342,33 @@ namespace ZNsMain TypeLength AL_OriginLen , TypeLength AL_ReplaceLen ) - ###############################################################################*/ + ##############################################################################*/ - ZCStringBase& ReplaceSection( ////////////////////////////////////// - TypeLength AL_SectPos , - TypeLength AL_SectLen , - TypeCharC* APC_Replace, - TypeLength AL_ReplaceLen - /*/////////*/ ) //////////////////////////////////////////////////// + template ZCStringBase& ReplaceFromInfoList /*///////*/ + ( + TSearchInfoList& AR_InfoList, ZCCharViewC& AR_Origin, ZCCharViewC& AR_Replace + ) + /*############################################################################*/ + { + return ReplaceFromInfoList + ( + AR_InfoList, + AR_Origin.data(), AR_Replace.data(), + AR_Origin.size(), AR_Replace.size() + ); + ////////////////////////// + }/* + /*############################################################################*/ + + + + ZCStringBase& ReplaceSection /////////////////////////////////////////////////// + ( + TypeLength AL_SectPos , TypeLength AL_SectLen , + TypeCharC* APC_Replace, TypeLength AL_ReplaceLen + ) + /*############################################################################*/ { return ReplaceSection( ///////////////////// *this , @@ -2176,13 +2379,26 @@ namespace ZNsMain ml_UseLen , AL_ReplaceLen /*//////////*/ ); ////////////////////////// - }/* - ZCStringBase& ReplaceSection( ////////////////////////////////////// - TypeLength AL_SectPos , - TypeLength AL_SectLen , - TypeCharC* APC_Replace, - TypeLength AL_ReplaceLen - ///////////// ) ////////////////////////////////////////////////*/ + } + /*############################################################################*/ + + ZCStringBase& ReplaceSection /////////////////////////////////////////////////// + ( + TypeLength AL_SectPos, TypeLength AL_SectLen, ZCCharViewC& AR_Replace + ) + /*############################################################################*/ + { + return ReplaceSection( ///////////////////// + *this , + mpc_Data , + AL_SectPos , + AL_SectLen , + AR_Replace.data() , + ml_UseLen , + AR_Replace.size() + /*//////////*/ ); ////////////////////////// + } + /*############################################################################*/ ZCStringBase& ReplaceRange /*##################################################*/ @@ -2276,14 +2492,16 @@ namespace ZNsMain ###############################################################################*/ - ZCStringBase& ReplaceRange( ////////////////////////////////// - const ZCStringBase& AR_CStrSearch1, - const ZCStringBase& AR_CStrSearch2, - const ZCStringBase& AR_CStrReplace, - bool AB_DoKeepSearch=false, - TypeLength AL_StartPos =0 , - bool AB_IsExactTwo =true - /*//////////*/ ) ///////////////////////////////////////////// + ZCStringBase& ReplaceRange ////////////////////////////////////////////////////// + ( + const ZCStringBase& AR_CStrSearch1, + const ZCStringBase& AR_CStrSearch2, + const ZCStringBase& AR_CStrReplace, + bool AB_DoKeepSearch=false, + TypeLength AL_StartPos =0 , + bool AB_IsExactTwo =true + ) + /*#############################################################################*/ { return ReplaceRange( ///////////////////////////////////// AR_CStrSearch1.data(), @@ -2296,15 +2514,33 @@ namespace ZNsMain AR_CStrReplace.size(), AB_IsExactTwo /*//////////*/ ); //////////////////////////////////////// - }/* - ZCStringBase& ReplaceRange( ////////////////////////////////// - const ZCStringBase& AR_CStrSearch1, - const ZCStringBase& AR_CStrSearch2, - const ZCStringBase& AR_CStrReplace, - bool AB_DoKeepSearch=false, - TypeLength AL_StartPos =0 , - bool AB_IsExactTwo =true - ///////////// ) ////////////////////////////////////////////*/ + } + /*#############################################################################*/ + + ZCStringBase& ReplaceRange ////////////////////////////////////////////////////// + ( + ZCCharViewC& AR_CStrSearch1 , + ZCCharViewC& AR_CStrSearch2 , + ZCCharViewC& AR_CStrReplace , + bool AB_DoKeepSearch=false , + TypeLength AL_StartPos =0 , + bool AB_IsExactTwo =true + ) + /*#############################################################################*/ + { + return ReplaceRange( ///////////////////////////////////// + AR_CStrSearch1.data(), + AR_CStrSearch2.data(), + AR_CStrReplace.data(), + AB_DoKeepSearch , + AL_StartPos , + AR_CStrSearch1.size(), + AR_CStrSearch2.size(), + AR_CStrReplace.size(), + AB_IsExactTwo + /*//////////*/ ); //////////////////////////////////////// + } + /*#############################################################################*/ ZCStringBase& ReplaceRange( /////////////////////////////////// @@ -2425,13 +2661,15 @@ namespace ZNsMain ///////////// ) //////////////////////////////////////////./*/ - ZCStringBase& ReplaceAllRange( //////////////////////////////// - const ZCStringBase& AR_CStrSearch1 , - const ZCStringBase& AR_CStrSearch2 , - const ZCStringBase& AR_CStrReplace , - bool AB_DoKeepSearch=false , - TypeLength AL_StartPos =0 - /*/////////*/ ) /////////////////////////////////////////////// + ZCStringBase& ReplaceAllRange /////////////////////////////////////////////////// + ( + const ZCStringBase& AR_CStrSearch1 , + const ZCStringBase& AR_CStrSearch2 , + const ZCStringBase& AR_CStrReplace , + bool AB_DoKeepSearch=false , + TypeLength AL_StartPos =0 + ) + /*#############################################################################*/ { return ReplaceAllRange( /////////////////////////////////// AR_CStrSearch1.data(), @@ -2443,14 +2681,33 @@ namespace ZNsMain AR_CStrSearch2.size(), AR_CStrReplace.size() /*/////////*/ ); ////////////////////////////////////////// - }/* - ZCStringBase& ReplaceAllRange( //////////////////////////////// - const ZCStringBase& AR_CStrSearch1 , - const ZCStringBase& AR_CStrSearch2 , - const ZCStringBase& AR_CStrReplace , - bool AB_DoKeepSearch=false , - TypeLength AL_StartPos =0 - //////////// ) ////////////////////////////////////////////*/ + } + /*#############################################################################*/ + + ZCStringBase& ReplaceAllRange /////////////////////////////////////////////////// + ( + ZCCharViewC& AR_CStrSearch1 , + ZCCharViewC& AR_CStrSearch2 , + ZCCharViewC& AR_CStrReplace , + bool AB_DoKeepSearch=false , + TypeLength AL_StartPos =0 + ) + /*#############################################################################*/ + { + return ReplaceAllRange + ( + AR_CStrSearch1.data(), + AR_CStrSearch2.data(), + AR_CStrReplace.data(), + AB_DoKeepSearch , + AL_StartPos , + AR_CStrSearch1.size(), + AR_CStrSearch2.size(), + AR_CStrReplace.size() + ); + } + /*#############################################################################*/ + ZCStringBase& ReplaceAllRange( //////////////////////////////// @@ -2485,7 +2742,7 @@ namespace ZNsMain // TSearchInfoList 은 class ZCSearchInfo 의 리스트 - template /*#########################################*/ + template /*/////////////////////////////////////////*/ static TypeLength GetNeedMemoryForReplace ( TSearchInfoList& AR_InfoList , @@ -2515,7 +2772,7 @@ namespace ZNsMain return VL_NeedMemory+AL_OriginLen ; }/* - template ############################################# + template ///////////////////////////////////////////// static TypeLength GetNeedMemoryForReplace ( TSearchInfoList& AR_InfoList , @@ -2525,7 +2782,7 @@ namespace ZNsMain ###############################################################################*/ - ZCStringBase& Insert /*########################################################*/ + ZCStringBase& Insert /*////////////////////////////////////////////////////////*/ ( TypeLength AL_InsertPos , TypeCharC* APC_Insert , @@ -2552,7 +2809,7 @@ namespace ZNsMain mpc_Data[ml_UseLen+=AL_InsertLen]=0; return *this; }/* - ZCStringBase& Insert /*########################################################## + ZCStringBase& Insert //////////////////////////////////////////////////////////// ( TypeLength AL_InsertPos , TypeCharC* APC_Insert , @@ -2575,8 +2832,20 @@ namespace ZNsMain }/* ZCStringBase& Insert(TypeLength AL_InsertPos, const ZCStringBase& AR_CStrInsert)*/ + ZCStringBase& Insert(TypeLength AL_InsertPos, const ZCCharView& AR_Insert) + { + return Insert //>>>>>>>>>>>>>>>>>>>>>> + ( + AL_InsertPos , + AR_Insert.data(), + AR_Insert.size() + ); + //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + }/* + ZCStringBase& Insert(TypeLength AL_InsertPos, const ZCCharView& AR_Insert)*/ - ZCStringBase& Insert_E /*######################################################*/ + + ZCStringBase& Insert_E /*//////////////////////////////////////////////////////*/ ( TypeLength AL_InsertPos , TypeCharC* APC_Insert , @@ -2590,14 +2859,18 @@ namespace ZNsMain else if(AL_InsertPos>ml_UseLen) { AL_InsertPos=ml_UseLen; } return Insert_E(AL_InsertPos, APC_Insert, AL_InsertLen) ; - }/* - ZCStringBase& Insert_E + } + /*#############################################################################*/ + + ZCStringBase& Insert_E /*//////////////////////////////////////////////////////*/ ( - TypeLength AL_InsertPos , - TypeCharC* APC_Insert , - TypeLength AL_InsertLen + TypeLength AL_InsertPos, const ZCCharView& AR_Insert ) /*#############################################################################*/ + { + return Insert_E(AL_InsertPos, AR_Insert.data(), AR_Insert.size()); + } + /*#############################################################################*/ ZCStringBase& Insert_E(TypeLength AL_InsertPos, TypeCharC* APC_Insert) @@ -2611,50 +2884,31 @@ namespace ZNsMain ZCStringBase& Insert_E(TypeLength AL_InsertPos, TypeCharC* APC_Insert)*/ - ZCStringBase& GetSubString /*##################################################*/ + ZCStringBase& GetSubString /*//////////////////////////////////////////////////*/ ( - TypeLength AL_Index , - TypeLength AL_Count , - ZCStringBase& ARR_CString + TypeLength AL_Index, TypeLength AL_Count, ZCStringBase& ARR_Rhs ) /*#############################################################################*/ { - if(AL_Index<0 || AL_Count<1) return ARR_CString; + if(AL_Index<0 || AL_Count<1) return ARR_Rhs; - #ifdef _DEBUG - - if(AL_Index+AL_Count>ml_UseLen) - { - std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); - fileout< CStringBase; + typedef CStringBase::ZCCharView ZCCharView ; + + + template class ZtCExamCStringBase_000 + { + public: + + static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0) + { + const ZCCharView CO_ZCCharView("1234AA5678AA90abcAAss"); + CStringBase VO_ZCStringStd(CO_ZCCharView); + cout<<"# "< class ZtCExamCStringBase_000*/ + + }/* + namespace ZNsExam*/ + +}/* +namespace ZNsMain*/ + + +int main(int AI_ArgCnt, char* APP_ArgVal[]) +{ + return ZNsMain::ZNsExam:: + + ZtCExamCStringBase_000<>::Main(AI_ArgCnt, APP_ArgVal); +}/* +int main(int AI_ArgCnt, char* APP_ArgVal[])*/ + + +/*//////////////////////////////////////////////////////////////////////////////////////// + +■ cygwin 컴파일 + + // g++ -mno-cygwin -o ZtCStringBase_000.exe ZtCStringBase_000.cpp -I../../my_CPP/CPP_Main/ -I../../my_CPP/CPP_Std/ -D__CYGWIN32__ -D__VISUAL_CPP_VER__=200300 + // g++ -mno-cygwin -o ZtCStringBase_000_D.exe ZtCStringBase_000.cpp -I../../my_CPP/CPP_Main/ -I../../my_CPP/CPP_Std/ -D__CYGWIN32__ -D__VISUAL_CPP_VER__=200300 -D_DEBUG + +■ mingw 컴파일 + + g++.exe -o ZtCStringBase_000_mw.exe ZtCStringBase_000.cpp -I../ + g++.exe -o ZtCStringBase_000_mw_D.exe ZtCStringBase_000.cpp -I../ -D_DEBUG + + ./ZtCStringBase_000_mw.exe + ./ZtCStringBase_000_mw_D.exe + + + Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest + # date + Sun Aug 24 10:47:09 KST 2025 + + Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest + # g++ --version + g++.exe (Rev2, Built by MSYS2 project) 13.2.0 + Copyright (C) 2023 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + +■ Linux 컴파일 + + g++ -std=c++98 -o ZtCStringBase_000.exe ZtCStringBase_000.cpp -I../ + g++ -std=c++98 -o ZtCStringBase_000_D.exe ZtCStringBase_000.cpp -I../ -D_DEBUG + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ gcc --version + gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0 + Copyright (C) 2019 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ date + Sun Aug 24 00:05:51 DST 2025 + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ cat /etc/os-release + NAME="Ubuntu" + VERSION="20.04.6 LTS (Focal Fossa)" + ID=ubuntu + ID_LIKE=debian + PRETTY_NAME="Ubuntu 20.04.6 LTS" + VERSION_ID="20.04" + HOME_URL="https://www.ubuntu.com/" + SUPPORT_URL="https://help.ubuntu.com/" + BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" + PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" + VERSION_CODENAME=focal + UBUNTU_CODENAME=focal + + + [sauron@q381-2657 ZCppMainTest]$ cat /etc/centos-release + CentOS Linux release 7.9.2009 (Core) + + [sauron@q381-2657 ZCppMainTest]$ g++ --version + g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) + Copyright (C) 2015 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +■ 실행 + + ./ZtCStringBase_000.exe + ./ZtCStringBase_000_D.exe + +////////////////////////////////////////////////////////////////////////////////////////*/