Как вы обрабатываете строки в С++?
Какой ваш любимый способ использовать строки в С++? Массив C-стиля char
s? Или wchar_t
? CString
, std::basic_string
, std::string
, BSTR
или CComBSTR
?
Конечно, у каждого из них есть своя область применения, но так или иначе, что является вашим фаворитом и почему?
Ответы
Ответ 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
Зависит от вашего приложения... Я сделал обширное встроенное программирование и обычно использовал массивы символов. Создание нового строкового объекта принимает тактовые циклы, которые теряются для большинства моих манипуляций с строками.