2008-09-25 3 views
17

C++에서 문자열을 사용하는 가장 좋은 방법은 무엇입니까? char s의 C 스타일 배열? 또는 wchar_t? CString, std::basic_string, std::string, BSTR 또는 CComBSTR?C++에서 문자열을 어떻게 처리합니까?

물론 이러한 각각의 응용 프로그램 영역이 있지만, 어쨌든, 당신이 가장 좋아하는 이유는 무엇입니까?

+0

FAQ http://stackoverflow.com/faq Ra를 읽어보십시오. 이것은 토론이 많이 필요한 자유로운 질문의 훌륭한 예입니다. Downvoted. –

+1

나는 Onorio에 동의하지 않습니다. 모든 선택 중에서 어느 문자열 시스템을 사용해야할지 모르는 사람에게는 큰 문제입니다. Onorio의 downvote를 취소하기 위해 Upvoted :) –

+0

당신은 멀티 플랫폼 솔루션을 찾고 있는지 또는 Windows 전용 솔루션을 찾고 있는지 명시해야합니다. 이건 매우 중요합니다. – sorin

답변

32

표준에 따라 std :: string 또는 std :: wstring. 왜?

  • 그들은 표준있어
  • 그들은있어 휴대용
  • 그들은 I18N 처리 할 수 ​​
  • 그들은
  • 는 버퍼 오버 플로우와 유사한 공격
  • 에 대해 보호 (표준에 따라) 성능 보장을 필요에 따라 다른 유형으로 쉽게 변환됩니다.
  • 멋지게 템플릿 처리되어 다양한 옵션을 제공하면서 코드가 부풀어 오르는 것을 줄이고 성능. 정말. 템플릿을 처리 할 수없는 컴파일러는 오래 전에 사라졌습니다.

C 스타일의 문자 배열은 문제를 묻는 중입니다. std :: string.c_str()이 필요한 경우도 있습니다.하지만 솔직히 C의 가장 큰 위험 중 하나는 프로그래머가 char *를 사용하여 나쁜 일을하고 감는 것입니다. 버퍼 오버 플로우. 그냥하지 마.

wchar__t의 배열은 똑같은 크기입니다.

CString, BSTR 및 CComBSTR은 표준이 아니며 이식 가능하지 않습니다. 절대로 강제하지 않는 한 피하십시오. 최적으로 std :: string/std :: wstring을 필요에 따라 변환하면 매우 비싸지 않을 것입니다.

std :: string은 std :: basic_string의 하위 항목이지만 std :: string을 사용하는 것이 더 좋은 이유가 아니라면 예외가 아닙니다. 정말 좋다. 이 상황에서 컴파일러가 최적화를 처리하도록하십시오.

+0

스택 오버플로가 방지하려는 경우 스택에 C 스타일 char 배열을 저장하지 마십시오. 힙에 보관하십시오. 그곳에; 문제 해결됨. 버퍼 오버플로를 의미하지 않는 한. – tzot

+0

죄송합니다. 분명히 버퍼를 의미했습니다. 고침, 고마워. – Zathrus

+0

여기에서 '아이의'는 무엇을 의미합니까? – fizzer

2

C 스타일의 char 배열이 그 자리를 차지하고 있지만 광범위하게 사용하면 한 번의 오류로 디버깅 시간을 낭비해야합니다. 우리는 우리의 (임베디드 개발 환경)에서 사용하기위한 맞춤 문자열 클래스를 가지고 있습니다.

항상 사용할 수있는 것은 아니므로 std :: string을 사용하지 않습니다.

6

std :: string 특별히 나열한 다른 API 중 하나를 사용하는 API를 호출해야하는 경우가 아니면

4

MFC를 사용할 수 있으면 CString을 사용하십시오. 그렇지 않으면 std :: string을 사용하십시오. 또한 std :: string은 표준 C++를 지원하는 모든 플랫폼에서 작동합니다.

+0

실제로, 임베디드 컴파일러는 헤더를 생략해도 여전히 표준을 준수 할 수 있습니다. –

+0

MFC를 강제로 사용하는 경우에만 권장합니다. 그것은 무시 무시한 것입니다. 그리고 그 위에, 어플리케이션 작성자가 만나는 것보다 많은 요구 사항이있는 프레임 워크입니다. 비용/혜택 비율의 오른쪽에 있지 않습니다. –

+1

MFC는 때로는 꽤 고통 스러울 수 있지만 CString 클래스는 그렇게 나쁘지 않습니다. 또한 MFC 전체를 포함 할 필요가 없습니다. QBziZ

8

std :: string !!

"표준"이라고하는 이유가 있습니다.

basic_string은 구현 세부 사항이므로 무시해야합니다.

BSTR & interop와 COM의 경우에만 interop의 경우에만 해당합니다.

2

언제든지 std::string (또는 basic_string<TCHAR>)을 사용합니다. 상당히 다재다능하며 (CStringT), 유형 안전 (printf과 달리)이 있으며 모든 플랫폼에서 사용할 수 있습니다.

2

기타, std :: wstring.

std :: string은 20 세기 기술입니다. 유니 코드를 사용하고 300 백만원 대신 60 억 명의 사람들에게 판매하십시오.

+0

에서 사용할 수 있습니다. Windows 용으로 만 개발 한 경우를 제외하고 wstring은 실제로 유니 코드와 호환되지 않습니다. –

1

프로젝트 설정에 따라 wchar 또는 char에 대한 정의 인 TCHAR을 사용하고 싶습니다. 필요한 기능 및 유형에 대한 모든 관련 정의를 찾을 수있는 tchar.h에 정의되어 있습니다.

1

std :: string 및 std :: wstring, 가능하면 할 수 있습니다.

완벽하지는 않지만 잘 테스트되고 잘 이해되며 매우 다양합니다. 표준 라이브러리의 다른 부분과도 잘 어울립니다.이 라이브러리는 거대한 보너스이기도합니다.

또한 언급 할만한 가치가 있습니다. stringstreams.

1

유니 코드는 미래입니다. char * 및 std :: string은 사용하지 마십시오. 제발) 나는 현지화 버그에 질려합니다.

+2

std :: string에서 유니 코드 문자열을 보유하는 것이 완벽하게 가능합니다. UTF-8로 인코딩하면됩니다. 실제로 다른 운영 체제를 대상으로하는 경우 wstring을 사용하는 것보다 훨씬 좋은 솔루션입니다. –

+0

그래,하지만 이것은 보관하기에 좋다. 'char' 기반 연산자 대신 문자 기반 연산을위한 메서드를 롤백해야합니다. –

1

표준 : : 문자열이없는 것보다는 낫다, 그러나 나는 선택의 여지가 때

+0

그 문자열 스트림은 무엇입니까 –

+0

부스트 StringAlgo 라이브러리는 그 대부분을 제공합니다. –

3

... 조인은 분할과 같은 기본 기능을 실종 성가신 심지어 괜찮은 형식으로 호출이다 (나는 보통하지 않습니다) , 나는 UTF-8 인코딩 (및 UTF8 CPP 라이브러리의 도움으로 표준 : : 문자열을 사용하는 경향이 있습니다. 나는 std :: string을 그렇게 좋아하지 않지만 적어도 표준적이고 휴대 가능합니다.

Unfortunatelly, 거의 모든 실생활 프로젝트에서 내부 문자열 클래스가 있습니다. 실제로 대부분 std :: string보다 좋지만 여전히 ...

+0

이전에이 라이브러리를 보지 못했지만 유용 할 것 같습니다. –

3

나는 Qt 개발자이기 때문에 가능한 QString을 사용하는 경향이있다. :)

유니 코드 호환, 스레드 안전 암시 적 공유 (일명 카피) 및 실용적인 실제 문제 (분할, 조인, 바꾸기 등)를 해결하도록 설계된 API가 제공됩니다. 정규 표현식), 숫자로의 변환/변환 ...)

QString을 사용할 수 없다면 std :: wstring. C로 붙어 있다면 glib GString을 권합니다.

1

응용 프로그램에 따라 다릅니다 ... 저는 광범위한 임베디드 프로그래밍을 수행했으며 일반적으로 문자 배열을 사용합니다. 새로운 문자열 객체를 생성하는 것은 대부분의 문자열 조작에 낭비되는 클럭 사이클을 필요로합니다.

2

MFC를 사용하는 경우 CString을 사용하십시오. 그렇지 않으면 나는 대부분의 다른 사람들과 동의한다 : std :: string 또는 std :: wstring 줄곧.

Microsoft는 std :: basic_string < TCHAR>를 MFC의 최신 업데이트에 추가하여 세계를 크게 좋아할 수있었습니다.

관련 문제