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

C++빌더 Q&A
C++Builder Programming Q&A
[2178] Re:Re:[질문] String과 AnsiString의 차이점?
차원철 [] 5550 읽음    1999-10-27 00:00
: : 제가 String로 선언하여 사용하는 변수가 있었는데, 이상한 에러가
: :               발생했습니다. String과 AnsiString의 차이점이 무엇인가요? 아시는 분이
: :               계시면 저에게 도움을 주시기 바랍니다. 그리고 제가 AnsiString라고
: :               선언하여 사용해 보기도 했는데, 그것도 여의치가 않습니다.(제가 넘
: :               기본이 안 돼있는건지도...?)
: :               에러 메시지는
: :               [C++ Error] Unit2.cpp(76): E2031 Cannot cast from 'AnsiString' to
: :               'char*' 라고 나타납니다.
: :               아마 String이 내부적으로는 char*형으로 처리를 하는가 봅니다.
: :               만약 String와 비슷하게 AnsiString를 쓸 수 있다면 그 길이를 구하는
: :               메소드도 가르쳐 주십시요.
: :               String형에서는 변수명->Length() 하면 그 스트링의 길이를 얻을수가
: :               있었는데, AnsiString으로 하며는 여기에서 에러가 발생합니다.
: :               도와 주시기 바랍니다.
: :               감사합니다.
:
:
:
: 임펠리테리입니다.
:
: 빌더는 C++ 컴파일러라는 것을 잊지 마시기 바랍니다. C++은 그 조상이랄 수 있는 C에서부터,
: 기본 스트링은 널로 끝나는 문자 배열입니다. 이것은 엄연히 빌더에서 지원하는 안시스트링과는
: 다릅니다. 빌더의 안시스트링은, 스트링 조작을 쉽게 하고 델파이의 스트링과 호환되게 하기 위해
: 새로이 추가한 클래스입니다.
:
: 이 안시스트링 클래스는, 내부적으로 데이터로서 표준 C++ 스타일의 널로 끝나는 문자열을 가지고 있습니다.
: 그러므로 내부에 가지고 있는 문자열의 포인터를 리턴하는 멤버 함수가 있는데, 바로 c_str()입니다.
: 만약,
: AnsiString MyString = "저는 스트링입니다.";
: 라고 했다면, 표준 C++ 스타일 문자열 포인터가 필요하다면,
: MyString.c_str() 이라고 하면 됩니다.
:
: 위의 MyString 선언에서 많은 것을 생각해볼 수 있습니다. " 로 둘러싸여진 문자열은 분명히 C++ 표준
: 문자열 포인터입니다. 그런데, 이것을 안시스트링인 MyString에 집어넣은 것이 적법합니다. 여기서는
: 아무런 에러도 나지 않죠. 그 이유는, 안시스트링은 오버로드된 여러가지 생성자중 문자열 포인터를
: 인자로 받는 생성자가 있기 때문입니다. 이 생성자의 내부코드를 보면, 받은 문자열 포인터를
: 내부 데이터로 가지는 문자열에 복사해넣는 코드를 볼 수 있습니다.
: 또 한가지 의문이 있을 수 있습니다. 위에서는 생성자가 사용되지 않은, 단순한 할당문일 뿐인데
: 왜 제가 생성자를 언급할까요? 기본적으로는, C++ 문자열 포인터와 안시스트링은 서로 호환이 안되는
: 타입이므로, 사실상 캐스팅 관련 메커니즘이 적용됩니다. C++을 제대로 공부하셨다면, 클래스인 타입에
: 있어서는, 캐스팅은 생성자를 호출하는 것이란 것을 기억하실 겁니다.
:
: 에러가 발생하는 이유은 위에서 말씀드렸지요? 안시스트링에서 문자열 포인터를 얻어내려면 멤버함수인
: c_str()을 사용해야 합니다.
:
: 마지막으로 사족. 빌더에서 String 과 AnsiString은 동일합니다. 정확히 어느 헤더파일인지 모르겠는데,
: 빌더의 표준 헤더중 하나에 보면 다음과 같은 라인이 있습니다.
: typdef AnsiString String;
: 무슨 말인지 아시죠? AnsiString이란 기존의 타입으로 그것과 동일한 String이란 새 타입 이름을 만든겁니다.
: 그 이상도, 이하도 아닙니다. 그냥, String은 AnsiString입니다.
:
: Length() 함수를 사용했는데 에러가 났다는 말은 잘못 아신 것 같습니다. 다시 확인해보시죠.
:
: 한가지 추가적으로, 간단하지만 중요한 팁 하나 드리죠. 안시스트링의 c_str()함수에서 리턴된 포인터는,
: 물론 포인터이므로 거기다 어떤 값을 써넣을 수도 있습니다만, 이것은 어디까지나 컴파일러가 봤을때
: "음.. 불법은 아니군." 하는 것이지, 실제로는 런타임에러가 납니다. 이것은 당연한데, c_str() 함수가
: 리턴한 포인터는 안시스트링 클래스가 내부적으로 처리하는 포인터의 값만을 넘겨준 것이기 때문입니다.
: 그러므로 이 포인터에는 어떤 값도 직접 write해서는 안된다는 것을 유의해야 합니다. 다시 말해서,
: 컴파일 에러가 나지 않을 뿐이지, c_str()로 리턴된 포인터는 리드온리(read-only)라고 생각해야 합니다.
:
: 그럼 참고하시길...

답변 감사합니다.

+ -

관련 글 리스트
2168 [질문] String과 AnsiString의 차이점? 차원철 4257 1999/10/26
2174     Re:[질문] String과 AnsiString의 차이점? 박지훈.임프 10417 1999/10/26
2180         Re:Re:[질문] String과 AnsiString의 차이점? 차원철 5382 1999/10/27
2178         Re:Re:[질문] String과 AnsiString의 차이점? 차원철 5550 1999/10/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.