2008-09-25 3 views
17

Какой ваш любимый способ пойти со строками на C++? Массив C-стиля char s? Или wchar_t? CString, std::basic_string, std::string, BSTR или CComBSTR?Как вы обрабатываете строки в C++?

Конечно, каждый из них имеет свою область применения, но так или иначе, что является вашим любимым и почему?

+0

Пожалуйста, прочтите FAQ http://stackoverflow.com/faq Ra. Это отличный пример открытого вопроса, который требует большого обсуждения. Downvoted. – 2008-09-25 13:44:27

+1

Я не согласен с Onorio - это отличный вопрос для тех, кто не знает, какую систему строк использовать для всех вариантов. Активировано, чтобы отменить Onvio's downvote :) – 2008-09-25 15:43:20

+0

Вы должны указать, ищете ли вы многоплатформенное решение или только конкретный Windows. Это очень важно. – sorin 2010-01-10 17:08:29

ответ

32

std :: string или std :: wstring, в зависимости от ваших потребностей. Зачем?

  • Они стандарт
  • Они портативные
  • Они могут обрабатывать I18N
  • Они имеют гарантии исполнения (по стандарту)
  • Защита от переполнения буфера и других подобных атак
  • Легко конвертируются в другие типы по мере необходимости
  • Красиво оформлены шаблоны, предоставляя вам широкий выбор вариантов, одновременно уменьшая раздувание кода и улучшая представление. В самом деле. Компиляторы, которые не могут обрабатывать шаблоны, уже давно ушли.

C-style массив символов просто требует неприятностей. Вам по-прежнему придется иметь дело с ними по случаю (и это то, что для std :: string.c_str()), но, честно говоря, одна из самых больших опасностей в C - это программисты, делающие Bad Things с char * и завершающие с переполнением буфера. Только не делай этого.

Массив wchar__t - это то же самое, только больше.

CString, BSTR и CComBSTR не являются стандартными и не переносимыми. Избегайте их, если они не будут абсолютно принудительными. Оптимально, просто конвертируйте std :: string/std :: wstring в них, когда это необходимо, что не должно быть очень дорого.

Обратите внимание, что std :: string - это всего лишь ребенок из std :: basic_string, но вам все равно лучше использовать std :: string, если у вас нет по-настоящему уважительной причины. Действительно хорошо. Пусть компилятор позаботится об оптимизации в этой ситуации.

2

Матрицы символов C-образного типа имеют свое место, но если вы их широко используете, вы просите тратить время на отладку одной ошибкой. У нас есть собственный собственный класс строк, предназначенный для использования в нашей (встроенной среде разработки).

Мы не используем std :: string, потому что это не всегда доступно для нас.

6

std :: string, если мне не нужно вызывать API, который специально берет один из перечисленных вами других.

4

Если вы можете использовать MFC, используйте CString. В противном случае используйте std :: string. Кроме того, std :: string работает на любой платформе, поддерживающей стандартный C++.

+0

Собственно, встроенные компиляторы могут опускать заголовок и по-прежнему соответствовать стандартам. – 2008-09-25 13:47:10

+0

Я бы рекомендовал только MFC, если вы вынуждены его использовать. Это ужасно, и, кроме того, это Рамка с насыщенными требованиями, чем писатель приложения должен будет встретиться. Это просто не в правой части соотношения затрат и выгод. – 2008-09-25 14:15:50

+1

Иногда MFC может быть довольно больно, но класс CString не так уж и плох. Вам также не нужно включать весь MFC для его использования. Он доступен в . – QBziZ 2008-09-25 15:09:53

8

std :: строка !!

Есть причина, по которой они называют это «Стандартом».

basic_string - это деталь реализации и ее следует игнорировать.

BSTR & CComBSTR только для interOp с COM, и только на момент взаимодействия.

2

Я использую std::string (или basic_string<TCHAR>) всякий раз, когда могу. Он довольно универсален (как и CStringT), он безопасен по типу (в отличие от printf), и он доступен на каждой платформе.

2

Другое, std :: wstring.

std :: string - технология 20-го века. Используйте Unicode и продайте до 6 миллиардов человек вместо 300 миллионов.

+0

. Wstring на самом деле не является Unicode-совместимым, за исключением случаев, когда вы разрабатываете только для Windows. – 2008-09-25 14:03:44

1

Мне нравится использовать TCHAR, который является определением для wchar или char в соответствии с настройками проектов. Он определен в tchar.h, где вы можете найти все связанные определения для функций и типов, которые вам нужны.

1

std :: string и std :: wstring, если можно, и что-то еще, если нужно.

Возможно, они не идеальны, но они хорошо протестированы, хорошо поняты и очень универсальны. Они прекрасно играют с остальной частью стандартной библиотеки, которая также является огромным бонусом.

Также стоит упомянуть, stringstreams.

1

Unicode - это будущее. Не используйте char * и std :: string. Пожалуйста) Я устал от ошибок локализации.

1

станд :: строка лучше, чем ничего, но это раздражает, что не хватает базовую функциональность, как раскол, присоединиться и даже достойный вызов формата ...

3

Когда у меня есть выбор (я обычно не делаю) , Я обычно использую std :: string с кодировкой UTF-8 (и с помощью библиотеки UTF8 CPP. Не то, чтобы мне нравилось std :: string, но это, по крайней мере, стандартное и портативное.

К сожалению, почти все реальные проекты, над которыми я работал, были внутренние строковые классы - большинство из них на самом деле лучше, чем std :: string, но все же ...

3

Я - разработчик Qt, поэтому, конечно, я стараюсь использовать QString по возможности :).

Это довольно хорошо: совместимый с Unicode, потокобезопасный неявный обмен (он же копируется на запись), и он поставляется с API, предназначенным для решения практических задач реального мира (разделение, объединение, замена (с и без regex), преобразование в/из чисел ...)

Если я не могу использовать QString, тогда std :: wstring. Если вы застряли с C, я рекомендую glib GString.

1

Зависит от вашего приложения ... Я сделал обширное встроенное программирование и обычно использовал массивы символов. Создание нового строкового объекта принимает тактовые циклы, которые теряются для большинства моих строковых манипуляций.

5

Вот статья, в которой сравниваются наиболее распространенные типы строк на C++ и способы их преобразования.Unraveling Strings in Visual C++

2

Если вы используете MFC, используйте CString. В противном случае я согласен с большинством других, std :: string или std :: wstring полностью.

Microsoft могла бы сделать мир огромной услугой, добавив std :: basic_string < TCHAR> перегружает в своем последнем обновлении MFC.

Смежные вопросы