| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Преобпазование типов: std::string->unsigned char[] |
| Автор: Alca 1.11.2008, 23:52 | ||||
| Преобпазование типов: std::string -> unsigned char[]? Строку:
надо преобразовать в
|
| Автор: J0ker 2.11.2008, 01:39 |
| метод c_str() возвращает const char * для std::string |
| Автор: Alca 2.11.2008, 01:51 |
| const char * это же не unsigned char[] |
| Автор: J0ker 2.11.2008, 02:03 |
| нет таких типов T[] - либо должен быть размер массива больше нуля (для C++), либо это эквивалентно T* (если, конечно, переменная сразу не инициализированна массивом) std::string - это массив char'ов к const unsigned char* можно преобразовать reinterpret_cast<const unsigned char *>(s.c_str()); |
| Автор: Alca 2.11.2008, 02:20 | ||||
|
| Автор: dumb 2.11.2008, 02:57 | ||
Alca, елы-палы. у тебя под тыщу сообщений, все примерно на одну тему, а АЗЫ никак не одолеем...
|
| Автор: J0ker 2.11.2008, 03:25 | ||||||
нехорошо конвертировать const в неconst но если приспичило unsigned char *ucBuffer = const_cast<unsigned char>(reinterpret_cast<const unsigned char *>(csStr.c_str())); Добавлено @ 03:27 тока предупреждаю - модифицировать данные по адресу ucBuffer нельзя - они принадлежат std::string |
| Автор: MAKCim 2.11.2008, 10:36 |
никогда в жизни std::string - это класс реализация может быть разной |
| Автор: Alca 2.11.2008, 12:25 | ||||
| Какой вариант наиболее оптимальный? Вариант 1:
Вариант 2: (не уверен корректный ли)
|
| Автор: Lazin 2.11.2008, 12:26 | ||
вообще, можно и проще сделать
|
| Автор: Cтpaнник 2.11.2008, 12:28 | ||
Дык, тогда уж зачем заморачиваться с выделением памяти "в достаточном количестве"?
|
| Автор: Lazin 2.11.2008, 12:29 | ||
|
| Автор: mes 2.11.2008, 12:46 | ||
Кто нибудь может разъяснить тайный смысл сего написанного ? |
| Автор: Alca 2.11.2008, 13:15 | ||||
Ну типа того:
|
| Автор: mes 2.11.2008, 13:24 | ||||
вот с какого боку там int iChar, когда ucBuff типа unsigned char. во первых можно написать короче, без непонятно для чего нужного приведенния к int
во вторых в цикле мы должны быть уверены, что ни при каком значение i мы не выйдем за границу выделенной памяти для ucBuff. |
| Автор: Alca 2.11.2008, 13:51 | ||||
А чем принципиальное отличие?
и
|
| Автор: mes 2.11.2008, 14:03 |
строчка не полна, и заставляет программиста лишний раз задуматься о происходящем, хотя никакой дополнительной нагрузки вышеупомянутый код не несет. во первых если делаете преобразование , то старайтесь делать его точно. А так вы оставляете преобразование unsigned int->unsigned char на волю компилятора. во вторых точное преобразование типа static_cast всегда лучше си-каста (использованного в Вашем примере). |
| Автор: Alca 2.11.2008, 14:06 |
| Спасибо. |
| Автор: JackYF 2.11.2008, 16:53 |
| Тему пометил решённой. Добавлено через 28 секунд Нет, не пометил Топикстартер, помечай. |
| Автор: J0ker 2.11.2008, 18:49 | ||
отчасти согласен, но смею указать, что спецификация метода c_str() приводит к тому, что эффективная реализация string в 99.99999% - это все-таки массив |
| Автор: vinter 3.11.2008, 14:23 | ||
какая спецификация можети об этом говорить? c_str() возвращает сторонний буфер который умрет при любом изменении стринга, каким образом это связано с внутренностью стринга? |
| Автор: J0ker 3.11.2008, 17:53 |
никакая обычно (во всяком случае я не видел других вариантов) c_str() добавляет '\0' в конец строки и возвращает указатель на свой внутренний буфер - иная реализация была-бы не эффективна |
| Автор: MAKCim 3.11.2008, 19:32 | ||
ну как бы если мы используем С++ и std::string, то частое использование С-строк не приветствуется и говорит о кривости кода поэтому c_str() в принципе не должен использоваться часто, а значит и реализация не обязана быть эффективной |
| Автор: J0ker 3.11.2008, 20:46 | ||||
а я разве говорил где-то про обязательства? проясняю ситуацию в связи с тем, что: 1. c_str() быть обязана 2. организация внутреннего буфера std::string в виде нэйтив массива ничему не препятствует в плане эффективности на большинстве современных архитектур - внутренний буфер std::string организован обычно в виде массива |
| Автор: Lazin 3.11.2008, 21:00 | ||||||
я не согласен, многие интерфейсы используют const char* чтобы быть более универсальными, например, что-бы можно было написать так:
иначе пришлось бы писать так:
Добавлено через 1 минуту и 30 секунд хотя нет, можно было-бы писать foo("blablabla") в любом случае, просто в случае std::string неявно был бы вызван конструктор |
| Автор: MAKCim 3.11.2008, 22:29 | ||
| J0ker, это все понятно вопрос в чем вообще?
ты с чем-то не согласен? |
| Автор: J0ker 4.11.2008, 06:05 |
| ладно, MAKCim, ты победил |
| Автор: JackYF 4.11.2008, 19:13 |
| Вообще говоря, лишние конструкторы - лишнее падение производительности... ;) |