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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2024, 22:24   #1
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 66
По умолчанию printf печатает string?

Приветствую Уважаемые.
printf умеет печатать string?

Код:
//https://metanit.com/cpp/tutorial/2.16.php
#define STRICT //строгая проверка типов данных
#define UNICODE //кодировка UTF-8
//операторы препроцессора
#include <locale.h>//заголовочный файл для локализации
#include<stdio.h>
#include <iostream>
#include <string>

//using namespace std;//пространство имен - Стандартная Библиотека

int main()
{
    setlocale(LC_ALL,"");
    std::string ch="Hello";
    std::wstring wch=L"Салют";
    std::cout<<ch<<std::endl;
    std::wcout<<wch<<std::endl;
    std::printf ("HELLO,%s\n",ch);
    std::wprintf(L"Привет %ls\n",wch);
    std::wprintf(L"Финиш\n");

    return 0;
}
Если да, где я ошибся?
При компиляции вылетают предупреждения
warning: format '%s' expects argument of type 'char*', but argument 2 has type 'std::string' {aka 'std::__cxx11::basic_string<char>'} [-Wformat=]
Какой бы символ типа не пробовал.

P.S. C::B + GCC
druidvic вне форума Ответить с цитированием
Старый 31.07.2024, 07:18   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,342
По умолчанию

Не умеет, надо:
ch.c_str()
wch.c_str()
waleri вне форума Ответить с цитированием
Старый 31.07.2024, 23:52   #3
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 66
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Не умеет, надо:
ch.c_str()
wch.c_str()
Благодарю
Но как вы догадались?! Научите пжл.
Код:
20    std::wprintf(L"Привет %ls\n",wch);//выводит Привет+разный символ
21    std::printf ("HELLO,%s\n",ch.c_str());//работает
22    std::wprintf(L"Привет %ls\n",wch.c_str());//работает
23    std::wprintf(L"Финиш\n");
Я в отладчике остановил сначала на 20 строке - сделал скрин, затем на 23 - тоже скрин.
данные переменной wch идентичны.
Нашел еще
Цитата:
Сообщение от _Bers Посмотреть сообщение
Цитата:
Функция c_str() присутствует только для совместимости с с-style кодом.
И в собственном c++ style коде, её лучше избегать настолько, насколько это возможно, дабы не плодить "суржик" (смесь двух стилей в одном исходном коде)
Не пойму причем здесь стили С и С++?
Я вижу только "узкие" и "широкие" типы строк.
printf - для "узких", wprintf - для "широких". Соответственно объявил string ch и wstring wch.
Зачем было преобразовывать wch=L"Салют"? Это же "обычная широкая" строка С++.
В чем я ошибаюсь?

P.S. Даруй мне мудрость, превышающую помышление человеческое
druidvic вне форума Ответить с цитированием
Старый 01.08.2024, 05:11   #4
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от druidvic Посмотреть сообщение
Функция c_str() присутствует только для совместимости с с-style кодом.
это откуда такая ересь? Нужная функция

Цитата:
Сообщение от druidvic Посмотреть сообщение
на 20 строке
там неопределённое поведение

Последний раз редактировалось Алексей1153; 01.08.2024 в 05:38.
Алексей1153 вне форума Ответить с цитированием
Старый 01.08.2024, 07:46   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,758
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
это откуда такая ересь? Нужная функция
Это не ересь, а факт. То, что она нужная для С функции ничего не меняет.
p51x вне форума Ответить с цитированием
Старый 01.08.2024, 09:56   #6
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,010
По умолчанию

p51x, если что, я это написал не для спора, а как уточнение факта. Можно не играть в угадайку дальше.
Алексей1153 вне форума Ответить с цитированием
Старый 01.08.2024, 10:27   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,758
По умолчанию

Какая угадайка? Весь STL построен на концепции итераторов и у стринга они есть. c_str - это не const string, а C string.
p51x вне форума Ответить с цитированием
Старый 01.08.2024, 10:39   #8
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,010
По умолчанию

p51x,
Код:
const char*
никто не говорил про const string
Алексей1153 вне форума Ответить с цитированием
Старый 01.08.2024, 17:20   #9
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
там неопределённое поведение
Похоже тому что здесь написано Format specification syntax: printf and wprintf functions
Цитата:
Instead, do this:

printf( "%s", user_name );
Верить нельзя. c_str() - даже нигде не упоминается.

Нашел еще такое решение Это снимает самую распространенную проблему с printf, безопасно и прозрачно обрабатывая строковый вывод.
Но в таких тонкостях мне не разобраться.
P.S. Если у Вас получится, выложите коротенький работающий код, пжл.
P.S.S. C::B + GCC
druidvic вне форума Ответить с цитированием
Старый 01.08.2024, 17:27   #10
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
это откуда такая ересь?
https://programmersforum.ru/showpost...74&postcount=2
druidvic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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