Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2024, 19:35   #11
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,815
По умолчанию

Цитата:
Сообщение от druidvic Посмотреть сообщение
Верить нельзя. c_str() - даже нигде не упоминается.
А должно? Там речь идет про С функцию и С строки. Как вы получаете строку это ваше дело.

Цитата:
Сообщение от druidvic Посмотреть сообщение
P.S. Если у Вас получится, выложите коротенький работающий код, пжл.
Вы же сами выкладывали https://programmersforum.ru/showpost...95&postcount=3 c_str спасет в простейшем случае.
p51x вне форума Ответить с цитированием
Старый 01.08.2024, 23:19   #12
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 66
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А должно? Там речь идет про С функцию и С строки.
Не факт, скорее о С++. По крайней мере раздел назван C++.

Цитата:
Вы же сами выкладывали https://programmersforum.ru/showpost...95&postcount=3 c_str спасет в простейшем случае.
Да, конечно, спасет. Но хотелось бы разобраться и с этим вариантом https://learn.microsoft.com/ru-ru/ar...-with-modern-c . Мне в коде намного проще! И сразу видно как применить.

Там написано
Цитата:
Код:
std::string value = "Hello";
printf("%s\n", value);
На самом деле это должно было бы работать, но, уверен, вы отчетливо понимаете, что вместо этого результатом будет то, что ласково называют «неопределенным поведением».
Он понимает, Вы понимаете. Вот я и прошу объяснить В ЧЕМ заключена неопределенность?

Последний раз редактировалось druidvic; 01.08.2024 в 23:45.
druidvic вне форума Ответить с цитированием
Старый 02.08.2024, 00:08   #13
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,815
По умолчанию

Цитата:
Сообщение от druidvic Посмотреть сообщение
Не факт, скорее о С++. По крайней мере раздел назван C++.
Абсолютный факт. printf С функция, даже в С++ она "находится" в <cstdio> = C standard input|output

Цитата:
Сообщение от druidvic Посмотреть сообщение
Вот я и прошу объяснить В ЧЕМ заключена неопределенность?
В том, что std::string это класс, а не строка. printfу нужен указатель на С строку.
p51x вне форума Ответить с цитированием
Старый 02.08.2024, 14:22   #14
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 167
По умолчанию

>Он понимает, Вы понимаете. Вот я и прошу объяснить В ЧЕМ заключена неопределенность?

Не надо смешивать два разных языка - C и C++.
С-шные функции (такие как printf) совершенно не умеют работать с приплюснутыми объектами (такими как array, vector, string, map ).
Если вы используете C++, так и пользуйтесь его стандартным фреймворком. То есть iostream или format.
Например
std::cout << std::format("Hello {}!\n", "world");
DeepFlake вне форума Ответить с цитированием
Старый 02.08.2024, 19:49   #15
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 66
По умолчанию

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
>
Если вы используете C++, так и пользуйтесь его стандартным фреймворком. То есть iostream или format.
Например
std::cout << std::format("Hello {}!\n", "world");
Я и сам хотел бы, только С и С++ настолько смешали, что не понятно о каком из них идет речь в том или ином случае.

Цитата:
Сообщение от p51x Посмотреть сообщение
Абсолютный факт. printf С функция, даже в С++ она "находится" в <cstdio> = C standard input|output
В том, что std::string это класс, а не строка. printfу нужен указатель на С строку.
Или сама строка
Код:
std::wprintf(L"Привет %ls\n");
же работает. Тогда, в теории, можно использовать #define.
А .c_str() и формирует этот указатель. Или саму строку? Полезу, еще раз, читать о .c_str().

Спасибо!

P.S. Как все запутано. С Квантовой запутанностью проще разобраться, наверное.
druidvic вне форума Ответить с цитированием
Старый 02.08.2024, 20:35   #16
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,815
По умолчанию

Цитата:
Сообщение от druidvic Посмотреть сообщение
Или сама строка
Вы не поверите, но там указатель. А сама строка в данных лежит. Можете даже в дизасм глянуть.

Цитата:
Сообщение от druidvic Посмотреть сообщение
.c_str() и формирует этот указатель. Или саму строку? Полезу, еще раз, читать о .c_str().
Обычно он ничего не формирует, а отдает указатель на свой буфер.
p51x вне форума Ответить с цитированием
Старый 02.08.2024, 20:47   #17
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 167
По умолчанию

>А .c_str() и формирует этот указатель. Или саму строку?
>P.S. Как все запутано.

Да, это странная особенность языка C. Указатель на строку и есть сама строка. А язык C++ ещё больше запутывает: можно определить две сцепленные (ссылкой) друг с другом переменные-строки (entangled variables), но когда одна из них меняется, то тут же, без всякой задержки времени, меняется вторая строка. Но ведь во Вселенной скорость всех процессов конечна, такое не может быть! Оказывается - может. Оказывается, что это не две строки, а на самом деле одна строка, но она в друх разных обличьях (именах).
DeepFlake вне форума Ответить с цитированием
Старый 03.08.2024, 04:41   #18
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от druidvic Посмотреть сообщение
P.S. Как все запутано. С Квантовой запутанностью проще разобраться, наверное.
А бросить — не?
Цитата:
Это может звучать немного резковато, это просто моё скромное мнение, но есть две вещи, которым традиционно учат в университетах в курсе компьютерных наук (Computer Science, CS) и которые многие люди никогда полностью по-настоящему так и не понимают: указатели и рекурсия.
«Опасности обучения на Java» ← прочитать полностью и наконец-то бросить программирование.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 03.08.2024, 07:05   #19
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,032
По умолчанию

Цитата:
Сообщение от druidvic Посмотреть сообщение
да, я уже нашёл источник этого недомогания

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
Указатель на строку и есть сама строка
конечно же нет. Указатель - это просто указатель.

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
Не надо смешивать два разных языка - C и C++.
в данной теме речь идёт только про C++

И, да, C++, внезапно, тоже имеет функцию printf, только она лежит тут std:: printf
Если функция принимает const char* , это не делает такую функцию C-функцией. Это по-прежнему C++

Цитата:
Сообщение от druidvic Посмотреть сообщение
А .c_str() и формирует этот указатель. Или саму строку? Полезу, еще раз, читать о .c_str().
std::string инкапсулирует внутри себя буфер со строкой. Когда строка не очень длинная (обычно в районе 16 символов), то используется small string optimization (SSO). При этом буфер расположен прямо в теле объекта класса (поэтому, работа с короткими строками через std::string производится на стеке - очень шустро)
Для более длинной строки буфер уже размещается в динамической памяти, а в теле объекта класса лежит указатель на первый символ этого буфера (и длину буфера класс тоже помнит)

Чтобы получить указатель на начало внутреннего буфера (точнее - указатель на первый элемент буфера) нужно использовать метод c_str() или data()

После получения указателя следует помнить, что если поработать с объектом класса, изменяя последний его штатными методами, то полученный ранее указатель становится инвалидным (то есть, конечно, как повезёт, но в общем случае - да)

Ещё одна интересная особенность std:string (в отличие от вектора) - класс всегда обеспечивает наличие нулевого символа в в конце буфера. Это и позволяет передавать указатель на начало буфера в функции, которые принимают const char*

Последний раз редактировалось Алексей1153; 03.08.2024 в 07:24.
Алексей1153 вне форума Ответить с цитированием
Старый 03.08.2024, 08:23   #20
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,815
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Ещё одна интересная особенность std:string (в отличие от вектора) - класс всегда обеспечивает наличие нулевого символа в в конце буфера. Это и позволяет передавать указатель на начало буфера в функции, которые принимают const char*
Тут важно делать две оговорки:
1. data до С++11 вполне могла вернуть не нуль терминантный массив
2. std::string может иметь нулевые символы внутри строки
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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