C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[728] ~ 연산자로 문자열 String을 char* 가 필요한 곳에 보다 쉽게 사용하기.
김태선 [cppbuilder] 9102 읽음    2007-12-14 12:10
폼에 메모장, 버턴 하나 올려 놓고 다음을 붙여 넣기 해서 실행해 봅시다.

#include <stdio.h>
//---------------------------------------------------------------------------
inline char* __fastcall operator ~(const AnsiString& s)
{
    return s.c_str();
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String test = "100 이것은 ~연산자로 String을 보다 쉽게 쓰게 해줍니다.";
    char *p = ~test + 4;
    Memo1->Lines->Add(p);
    int  n = atol(~test);
    Memo1->Lines->Add(n);

    String test2 = "12345 한글";
    char buf[100];
    sscanf(~test2, "%d %s", &n, buf);
    Memo1->Lines->Add(n);
    Memo1->Lines->Add(buf);

    strcpy(buf, ~test);
    Memo1->Lines->Add(buf);
}
//---------------------------------------------------------------------------

String 은 델파이의 string 내부 키워드를 C++빌더로 옮겨 놓은 것입니다.
정식 명칭은 AnsiString 인데, 보통 String으로 간편하게 사용합니다.
그래서 String은 델파이 string과 호환을 가질뿐 아니라 C++ 특유의 객체적인 기능까지 부가되어 있어
델파이 string 보다 강력하고 쓰기 좋게 설계되어 있습니다.
하지만 델파이 키워드를 옮겨 구현한 클래스이기 때문에 상속을 받아 기능을 수정할 수 없는 것이 단점입니다.

String과 비교되는 VC의 문자열 클래스는 CString입니다.
CString은 빌더 String보다 성능은 떨어지지만 나름대로 편리한 문자열 형입니다.
CString은 C++ 클래스이기 때문에 상속을 받는 것도 가능하고 기능을 수정하는 것도 가능합니다.

몇해전에 CString을 빌더 버전으로 옮겨 본 일이 있는데, 빌더에서 String, CString을 동시에 쓰는 것은 즐거운 일이더군요.

그런데 String 이 CString보다 현실적으로 불편한 것은 char* 형이 요구되는 곳에는
CString 형 변수는 그냥 변수명만 기입하면 되는데, 빌더는 변수명.c_str() 식으로 항상 사용해야 합니다.

VC:
CString str = "test";
sscanf(str, "%s", temp);

빌더:
String str = "test";
sscanf(str.c_str(), "%s", temp);

큰 불편이라고하는 할수 없고 불만 사항도 아니지만,
좀 더 간편하게 쓸수 없을까 생각하다가 String을 상속받아 기능을 수정하는 것은 불가능하니
연산자를 동원하는 방법으로 해결해 봤습니다.
~ 연산자는 사실 실무에서는 잘 쓰는 일이 없는
1의 보수를 구하는 연산자입니다. 1의 보수는 ~ 연산자보다는 ^ 0xffff 식이 더 많이 쓰입니다.
그리고, 클래스 소멸자에 붙는 ~와는 완전히 다른 것입니다.
~ 연산자를 오버로딩한다고 해서 기존 정수에 대한 ~ 연산자 기능은 아무런 지장 없이 사용할 수 있습니다.(너무 당연)

그래서 ~를 이용해  char* 가 필요한 곳에는 다음과 같이 쓸수 있습니다.
String str = "test";
sscanf(~str, "%s", temp);


실무에 전혀 무리 없이 쓸수는 있습니다만
어째 좀 잘한 것 같지는 않는데...
심심해서 만들어 본 꼼수 팁이었습니다.
ㅡ,.ㅡ;
장성호 [nasilso]   2007-12-14 12:48 X
심심하시다구요?  그럼 제 일좀 도와주세요. (농담)

c_str()  ...
불편함을 느끼면서도 개선해서 써야겠다는 생각을 해보진 못했네요
~ 연산자.. 저는 업무에 가끔 쓰곤 하는데...

하여간 함 써봐야 겠네요 유용할듯...
아제나 [azena]   2008-03-03 19:39 X
문자열을 보수연산 할 일은 없을테니 ㅋㅋ
좋은 팁인 것 같습니다.
저의 debug.h 에 넣어놔야 겠네요 ㅎㅎ
김태선 [cppbuilder]   2008-09-11 19:44 X
애초의 생각과는 달리 실무에 너무나 유용합니다.

제가 만들고도 제가 감탄을 다 하네요 ^^;

+ -

관련 글 리스트
728 ~ 연산자로 문자열 String을 char* 가 필요한 곳에 보다 쉽게 사용하기. 김태선 9102 2007/12/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.