Подтвердить что ты не робот

Как вы обрабатываете строки в С++?

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

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

4b9b3361

Ответ 1

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

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

Массив символов в стиле C просто просит неприятностей. Вам по-прежнему придется иметь дело с ними по случаю (и то, что для 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

std::string!!

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

basic_string - деталь реализации и должна быть проигнорирована.

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

Ответ 3

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

Ответ 4

Здесь приведена статья, в которой сравниваются наиболее распространенные типы строк на С++ и как конвертировать между ними. Разрушение строк в Visual С++

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

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

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

Ответ 14

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

Ответ 15

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

Ответ 16

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