![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,815
|
![]()
А должно? Там речь идет про С функцию и С строки. Как вы получаете строку это ваше дело.
Вы же сами выкладывали https://programmersforum.ru/showpost...95&postcount=3 c_str спасет в простейшем случае. |
![]() |
![]() |
![]() |
#12 | ||
Пользователь
Регистрация: 05.06.2016
Сообщений: 66
|
![]()
Не факт, скорее о С++. По крайней мере раздел назван C++.
Цитата:
Там написано Цитата:
Последний раз редактировалось druidvic; 01.08.2024 в 23:45. |
||
![]() |
![]() |
![]() |
#13 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,815
|
![]()
Абсолютный факт. printf С функция, даже в С++ она "находится" в <cstdio> = C standard input|output
В том, что std::string это класс, а не строка. printfу нужен указатель на С строку. |
![]() |
![]() |
![]() |
#14 |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 167
|
![]()
>Он понимает, Вы понимаете. Вот я и прошу объяснить В ЧЕМ заключена неопределенность?
Не надо смешивать два разных языка - C и C++. С-шные функции (такие как printf) совершенно не умеют работать с приплюснутыми объектами (такими как array, vector, string, map ). Если вы используете C++, так и пользуйтесь его стандартным фреймворком. То есть iostream или format. Например std::cout << std::format("Hello {}!\n", "world"); |
![]() |
![]() |
![]() |
#15 | ||
Пользователь
Регистрация: 05.06.2016
Сообщений: 66
|
![]() Цитата:
Цитата:
Код:
А .c_str() и формирует этот указатель. Или саму строку? Полезу, еще раз, читать о .c_str(). Спасибо! P.S. Как все запутано. С Квантовой запутанностью проще разобраться, наверное. ![]() |
||
![]() |
![]() |
![]() |
#16 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,815
|
![]()
Вы не поверите, но там указатель. А сама строка в данных лежит. Можете даже в дизасм глянуть.
Обычно он ничего не формирует, а отдает указатель на свой буфер. |
![]() |
![]() |
![]() |
#17 |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 167
|
![]()
>А .c_str() и формирует этот указатель. Или саму строку?
>P.S. Как все запутано. Да, это странная особенность языка C. Указатель на строку и есть сама строка. А язык C++ ещё больше запутывает: можно определить две сцепленные (ссылкой) друг с другом переменные-строки (entangled variables), но когда одна из них меняется, то тут же, без всякой задержки времени, меняется вторая строка. Но ведь во Вселенной скорость всех процессов конечна, такое не может быть! Оказывается - может. Оказывается, что это не две строки, а на самом деле одна строка, но она в друх разных обличьях (именах). |
![]() |
![]() |
![]() |
#18 | ||
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
![]() Цитата:
Цитата:
В разработке: воспроизводственный контур ИТ
|
||
![]() |
![]() |
![]() |
#19 | ||
фрилансер
Участник клуба
Регистрация: 11.10.2019
Сообщений: 1,032
|
![]() Цитата:
![]() конечно же нет. Указатель - это просто указатель. в данной теме речь идёт только про C++ И, да, C++, внезапно, тоже имеет функцию printf, только она лежит тут std:: printf Если функция принимает const char* , это не делает такую функцию C-функцией. Это по-прежнему C++ Цитата:
Для более длинной строки буфер уже размещается в динамической памяти, а в теле объекта класса лежит указатель на первый символ этого буфера (и длину буфера класс тоже помнит) Чтобы получить указатель на начало внутреннего буфера (точнее - указатель на первый элемент буфера) нужно использовать метод c_str() или data() После получения указателя следует помнить, что если поработать с объектом класса, изменяя последний его штатными методами, то полученный ранее указатель становится инвалидным (то есть, конечно, как повезёт, но в общем случае - да) Ещё одна интересная особенность std:string (в отличие от вектора) - класс всегда обеспечивает наличие нулевого символа в в конце буфера. Это и позволяет передавать указатель на начало буфера в функции, которые принимают const char* Последний раз редактировалось Алексей1153; 03.08.2024 в 07:24. |
||
![]() |
![]() |
![]() |
#20 | |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,815
|
![]() Цитата:
1. data до С++11 вполне могла вернуть не нуль терминантный массив 2. std::string может иметь нулевые символы внутри строки |
|
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Please, help me! модификаторы спецификации диалога для printf. Conversation specification modifiers for printf. | AselNU | Помощь студентам | 5 | 14.10.2018 15:33 |
printf печатает последнее введеное в scanf | aktec | Помощь студентам | 9 | 07.03.2011 20:41 |
не печатает изображение | Djony_91 | Мультимедиа в Delphi | 8 | 26.05.2010 04:17 |
не печатает принтер!!!! | ronich | Операционные системы общие вопросы | 5 | 22.11.2007 08:52 |