출처 : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=729

 폼에 메모장 하나 올려 놓고 아래 코드 붙여넣기 해서 실행하면 됩니다.

//---------------------------------------------------------------------------
// Cross String wrapper class : XString
//
//  C++빌더의 훌륭한 스트링 클래스 String은 char* 가 요구되는 곳에
//    stirng.c_str() 와 같이 c_str() 메소드를 사용해야 합니다.
//  조금 귀잖습니다.
//  그래서 String 과 같으면서 c_str() 메소드를 사용할 필요가 없이
//  자동으로 형변환이 되어 들어가는 스트링 클래스를 만들어 봤습니다.
//  String 과 char* 의 장점을 동시에 쓸수 있게 하는 것입니다.
//  원래 String 클래스를 상속받아 여기에 기능을 수정하면 간단한데,
//  String 클래스는 상속이 안됩니다. 그래서 간단한 레퍼 클래스인
//  크로스스트링 클래스를 만들었는데, 기본 문자열 스트링과 거의 사용법이 같습니다.
//  래퍼클래스로 약간의 사용법상 차이 외는 모든 것이 같습니다.
//
// Written by 김태성 (jsdkts@korea.com)

class XString
{
private:
    String    str;

public:
    XString()
    {
    }
    XString(char* s)
    {
        str = s;
    }
    XString(String& s)
    {
        str = s;
    }
    // String 이 쓰이는 곳에 바로 강제 형변환없이 사용하게 한다.
    operator String()
    {
        return str;
    }
    // char* 가 쓰이는 곳에 바로 강제 형변환없이 사용하게 한다.
    operator char*()
    {
        return str.c_str();
    }
    // 스트링 클래스 메소드를 직접 사용할때.
    String* operator ->()
    {
        return &str;
    }
    // 이것은 형을 String형으로 명확하게 하는 * 연산자.
    String& operator *()
    {
        return str;
    }
};
//---------------------------------------------------------------------------
//  String을 ~ 연산자를 통해 char* 를 바로 얻는 기법으로 c_str() 메소드를 안쓰게 해줍니다.

inline char* __fastcall operator ~(const AnsiString& s)
{
    return s.c_str();
}
//---------------------------------------------------------------------------


// test

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    XString  s = "이것은 문자열테스트입니다.";
    char buf[100];
    strcpy(buf, s);

    Memo1->Lines->Add( s );
    Memo1->Lines->Add( buf );

    // 이렇게 메소드를 사용할 수 있습니다.
    s->printf("[ %s ]", buf);
    Memo1->Lines->Add( s );

    // 대입을 받는 측은 자동형 설정이 안되므로 * 연산자로 강제로 형을 지정해야 한다.
    *s = s + " 하하하. " + " 호호호.";
    Memo1->Lines->Add( s );

    // 이런식으로도 메소드를 사용할 수 있습니다.
    (*s).printf("다음줄입니다. %d  ", 100);
    Memo1->Lines->Add( s );

    // String과 XString과 상호치환도 그냥 됩니다.
    String ss = "HoHo 또 다른 면입니다.";
    s = ss;
    Memo1->Lines->Add( s );

    // 이렇게 String 처럼 사용하는데 지장이 없습니다.
    ss = "흐흐... " + s + " 후후";
    Memo1->Lines->Add( ss );

    strcpy(s + 5, "나나나나나");
    Memo1->Lines->Add( s );

    // 첨자는 0부터라는 점에 String이 1부터라는 것과 다릅니다.
    // 이는 순수 char* 문자열과 같다고 보시면 됩니다.
    s[0] = 'A'; // ==    (*s)[1] = 'A'; <- String식으로 하려면
    s[2] = 'B';
    Memo1->Lines->Add( s );
    char ch = s[1];
    Memo1->Lines->Add( ch );
}
//---------------------------------------------------------------------------

이전 저의 ~ 오퍼레이터를 사용하는 String의 char* 변환 기법을 쓰거나
이번에 소개한 XString을 문자열을 보다 간편하게 제어하기 위해 사용할 수 있습니다.

String, XString, ~ 연산자, char* 문자열 등
마음에 드는 것 골라 골라 쓸수도 있습니다.


그리 중요한 것 같지 않은데 ㅡ,.ㅡ;;;
심심해서 만들어본 클래스입니다.
휘리릭~~~~

인터넷에서 찾아서 참고 하고 수정한 함수들...

/********************************************************************************************
한 비트값을 얻고자할때  index는 8bit 중 그 위치
GetBits (변수 ,  순서);  
7 6 5 | 4 3 2 1 0
GetBit(word,5); 5번째 값을 가져옴.. ^^
********************************************************************************************/
int GetBit (unsigned char data, int index) 
{
    unsigned char mask = 0x01;
    mask = mask << index;
    int i = data & mask;
    i = i >> index;
    return i;
}

/********************************************************************************************
2bit이상의 값을 추출할때 index(7-0)는 마지막 위치 ,  size는 가져오는 비트수
GetBits (변수 ,  5 , 3);  7 - 5까지 값을 가져옴.. ^^
7 6 5 | 4 3 2 1 0
********************************************************************************************/
int GetBits (unsigned char data, int index, int size) 
{
   unsigned char mask = 0xFF;
   mask = mask << (8-size);
   mask = mask >> (8-size);
   mask = mask << index;
   int i = data & mask;
   i = i >> index;
   return i;
}

// 형변환 모음
// CString형을 double형으로 변환
double CString2double(CString str)
{
   char *Temp = (LPSTR)(LPCSTR)str;
   return atof(Temp);
}

// double형을 CString형으로 변환
CString double2CString(double num)
{
   CString Temp;
  Temp.Format("%f", num);
  return Temp;
}

// CString형을 char* 형으로 바꾸는 함수
char *CString2char(CString str)
{
   char *charTemp = (LPSTR)(LPCSTR)str;
   return charTemp;
}


// 그외 형변환 참조 기존 자료들..
// int -> char *
Visual C++ 에는 다음과 같은 함수가 있습니다.
int , __int64 , unsigned __int64 등의 데이터형을 char* 형으로 바꾸어주는 함수들입니다.
인자에 대해 설명하자면 int value 는 입력값, char *string 은 출력값, int radix 는 출력될 진법을 표시합니다.
예를 들어 radix를 16으로 설정하면 16진수로 출력한다는 말이죠. radix 값은 2~36 사이의 값만 가능합니다.

char *_itoa( int value, char *string, int radix );
char *_i64toa( __int64 value, char *string, int radix );
char * _ui64toa( unsigned __int64 value, char *string, int radix );
wchar_t * _itow( int value, wchar_t *string, int radix );
wchar_t * _i64tow( __int64 value, wchar_t *string, int radix );
wchar_t * _ui64tow( unsigned __int64 value, wchar_t *string, int radix );

// char* 형을 double 형으로 바꾸는 함수
double atof( const char *string );

// char* 형을 int 형으로 바꾸는 함수
int atoi( const char *string );

// char* 형을 __int64 형으로 바꾸는 함수
__int64 _atoi64( const char *string );

// char* 형을 long 형으로 바꾸는 함수
long atol( const char *string );
AnsiString으로 정의된 변수 뒤에..
c_str() 를 붙여주면 자동을 변환됨...
1) WideString
캐스팅 시키는 함수. 아래 방법으로 하시면, A에 wchat_t 형식으로 Hello가 들어갑니다.

A = WideString("Hello");

2) StringToOleStr
원라는 AnsiString용 함수입니다. char 배열도 사용할 수 있습니다.

A = StringToOleStr("Hello");

3) MultiByteToWideChar
이 방법을 쓰시면 UTF8 형식으로도 변경할 수 있습니다. UniCode를 사용하는 경우, 이 API를 꼭 이용하셔야 합니다. UTF8을 원하시면 CP_ACP 부분을 CP_UTF8 로 바꾸어 주시면 됩니다. 이 방법은 조금 복잡합니다. 먼저 문자열 길이가 얼마나 나오는지 얻어낸 다음, 그 길이만큼 변수를 잡고, 변환을 다시 시켜야 합니다.

String            stString = "HELLO";
int               itWideSize = MultiByteToWideChar(CP_UTF8, 0, stString.c_str(), stString.Length() + 1, NULL, 0);
wchar_t           *wcTarget = new wchar_t[itWideSize];

MultiByteToWideChar(CP_ACP, 0, stString.c_str(), stString.Length() + 1, wcTarget, itWideSize);
=========================================================================================================
볼랜드포럼 유영인님 글에서 발췌

2006/07/05 11:46

+ Recent posts