Как вы обрабатываете строки в C ++? - PullRequest
17 голосов
/ 25 сентября 2008

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

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

Ответы [ 15 ]

32 голосов
/ 25 сентября 2008

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, если у вас нет веских причин не делать этого. Действительно хорошо. Пусть компилятор позаботится об оптимизации в этой ситуации.

8 голосов
/ 25 сентября 2008

std :: string !!

Есть причина, почему они называют это "Стандарт".

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

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

6 голосов
/ 25 сентября 2008

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

5 голосов
/ 20 ноября 2008

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

4 голосов
/ 25 сентября 2008

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

3 голосов
/ 25 сентября 2008

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

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

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

3 голосов
/ 25 сентября 2008

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

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

2 голосов
/ 20 ноября 2008

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

Microsoft могла бы оказать миру огромную услугу, добавив перегрузки std :: basic_string в свое последнее обновление MFC.

2 голосов
/ 25 сентября 2008

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

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

2 голосов
/ 25 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...