Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185

swprintf в MinGW

20.07.2023, 10:51. Показов 5297. Ответов 103
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу:

C++
1
2
3
wchar_t s[300];
int i=10;
swprintf(s, 20, "%i",i);
Компилятор показывает ошибку:

invalid conversion from 'int' to 'const wchar_t*' [-fpermissive]|
У ГНУсов сказано:

В Windows эта функция не принимает размер буфера в качестве второго аргумента.
Но если написать без указания размера, как в sprintf, тоже показывает ошибку: вторым аргументом требует size_t.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.07.2023, 10:51
Ответы с готовыми решениями:

Как правильно создать строку, используя swprintf?
Дело в том, что мне нужно записать три числа в строку: double, int и double. Числа такие: 1.1414 4 3.4402 (это примеры, сами числа...

Может ли MinGW x64 компилить приложения x32? Или нужно для этого отдельно ещё MinGW х32 качать?
Просто решил поиграться с CodeLite.

Mingw-w64 MinGW TDM-GCC
Всем привет. Хочу понять, существует ли принципиальная разница между Mingw-w64, MinGW и TDM-GCC? Какие плюсы/минусы у этих трех...

103
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
20.07.2023, 11:06
C++
1
swprintf(s, 300, L"%i",i);
0
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
20.07.2023, 11:08
Ты не замечаешь того, что в качестве format передаешь const char*, а не const wchar_t*

C++
1
swprintf(s, L"%i",i);
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
20.07.2023, 20:41
Цитата Сообщение от Хатобато Посмотреть сообщение
Но если написать без указания размера, как в sprintf, тоже показывает ошибку: вторым аргументом требует size_t.
Вы что-то выдумываете. Либо первая ошибка, либо вторая.

Если у вас эта функция действительно не принимает размер буфера и вы уберете размер из вашего примера, то ошибка будет совсем другая: обычная строка передается в качестве формата, а требуется широкая строка.

Отдельно стоит заметить, что в MSDN эта функция описана с размером буфера.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
24.07.2023, 09:13  [ТС]
TheCalligrapher, спасибо! Я уже отметила полезный ответ leproza: надо было поставить L перед строкой. Правда, не поможет, если в строке есть русские буквы: L перед такой строкой сразу отмечает как ошибку.

C
1
wsprintf(ar,L"Муму %i", r);
error: converting to execution character set: Illegal byte sequence
Добавлено через 19 минут
Кстати, ещё и дубликатов функций понаделали, вроде этих wsprintf и swprintf: разницы как-то не видно
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
24.07.2023, 11:23
Цитата Сообщение от Хатобато Посмотреть сообщение
wsprintf
А что это за девушка и где она живет,
А вдруг она не курит, а вдруг она не пьет ?
Ну а мы с такой компанией .... )

Это похоже на что то Виндмастдайное из winuser.h, и это псевдоним, с какими строками она работает, зависит от настроек компиляции.
The winuser.h header defines wvsprintf as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
24.07.2023, 16:40
Цитата Сообщение от Хатобато Посмотреть сообщение
Правда, не поможет, если в строке есть русские буквы: L перед такой строкой сразу отмечает как ошибку.
Файл (исходник) должен быть сохранен в UTF-8, чтобы это работало.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
24.07.2023, 20:28  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Файл (исходник) должен быть сохранен в UTF-8, чтобы это работало.
В CodeBlocks, при сохранении, вижу только выбор типа файла, но не его формата. В меню Edit есть File encoding, но если выбрать что-то, кроме System default, компилятор каждую букву отмечает как ошибку. Наверное, надо переключать при пустом файле.

С кодировками - сплошные проблемы. Кто-то даже написал на одном из форумов "как если бы, вместо туалетной бумаги, дали топор и рубанок, и отправили в лес"

Сделала себе такое:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int antus(char *s, wchar_t *ss, int l)
 
{
 
 
     int i=0;
 
    while (i<l)
 
    {
 
      if ((s[i]>=-65) && (s[i]<=-1))
   ss[i]=s[i]+1104;
   else
    ss[i]=s[i];
 
     if (s[i]==-88) ss[i]=1025;
     if (s[i]==-72) ss[i]=1105;
     if (s[i]==-71) ss[i]=0x2116;
 
    i++;
    }
 
    ss[i]=0;
 
    return i;
 
 
}
Увы, в Lazarus это не работает.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
24.07.2023, 21:10
Цитата Сообщение от Хатобато Посмотреть сообщение
В CodeBlocks, при сохранении, вижу только выбор типа файла, но не его формата.
Там можно сохранить, но способ неочевидный и объяснять долго. Поэтому - проще: открываете файл сторонним редактором, например notepad++, и (пере)сохраняете в Utf-8.

В винде L-строки кодируются в Utf-16. Компилятору надо знать исходную кодировку, чтобы сделать преобразование. Т.к. обычно это знание невозможно взять из воздуха (определить автоматически), то GCC\MinGW поступает проще: по умолчанию предполагает Utf-8.

Цитата Сообщение от Хатобато Посмотреть сообщение
С кодировками - сплошные проблемы.
Если не пытаться разобраться и делать наобум, то проблемы будут в любом деле.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
25.07.2023, 04:58  [ТС]
DrOffset, понятно. Из кучи подобных вещей и состоит эта проблема. Переход начали давным-давно, и до сих пор не выполнили. Делают - кто во что горазд... С информацией о преобразованиях - туго... Похоже, проблема будет вечной: вроде бы, намереваются делать utf-32...
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
28.03.2024, 22:43  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Там можно сохранить, но способ неочевидный и объяснять долго. Поэтому - проще: открываете файл сторонним редактором, например notepad++, и (пере)сохраняете в Utf-8.
Ничего не даёт. С Utf-8 - то же, что и с Ansi: с латиницей, помеченной "L", ограничивается предупреждением, а кириллица вообще не воспринимается. А после пересохранения в utf-16 весь код так же оказывается сплошной ошибкой, как и при попытке выбрать эту кодировку в редакторе.

Выяснилось, что, после смены кодировки, проблемы находит не в моём тексте, а в библиотечных файлах. Может, вообще не поддерживает utf-16?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
29.03.2024, 00:14
Хатобато, сохранять исходник в utf-16 не нужно. Utf-16 делает сам компилятор, когда видит L-литерал. И чтобы это сделать корректно, ему нужна корректная исходная кодировка. И для GCC\MINGW эта кодировка - UTF-8.

Цитата Сообщение от Хатобато Посмотреть сообщение
С Utf-8 - то же, что и с Ansi:
Так быть не должно.
Именно UTF-8 является отправной точкой по умолчанию для исходников в GCC\MINGW.
Именно эту кодировку по умолчанию использует компилятор при трансляции и именно с ней вы должны пытаться работать.
Если не получается, нужно разбираться что вы делаете не так, а не искать другие способы.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 05:12  [ТС]
А оно так есть...

Пересохранила в кодировке utf8 (которую и редактор CodeBlock показывает), но подобные вещи без L не принимает

C++
1
_swprintf(fm,L"%s\\%s",s,ms);
Пишет, что это - char, и требует wchar_t...
А если в строку форматирование добавить русский текст, то выводится пустая строка!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
 
 
int pp=125;
 
FILE *F=fopen("e:\\txt\\soi.txt","rt");
FILE *F1=fopen("e:\\txt\\soi_2903.txt","wt");
 
fgetws(s,999,F);
 
_swprintf(s1,L"%i. %s\n",pp,s);
 
fputws(s1,F1); // Выведено правильно
 
 
_swprintf(s1,L"Дурь № %i. %s\n",pp,s);
fputws(s1,F1); // Полностью отсутствует
 
fputws(s,F1); // Выведено правильно
 
pp=pp*2;
 
fwprintf(F1,L"%i. %s\n",pp,s); // Только цифры
 
 
fclose(F);
fclose(F1);
 
 
return 0;
 
 
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
29.03.2024, 08:53
Цитата Сообщение от Хатобато Посмотреть сообщение
но подобные вещи без L не принимает
Так и должно быть. Об этом и была речь выше.

Цитата Сообщение от Хатобато Посмотреть сообщение
fputws(s1,F1); // Полностью отсутствует
Цитата Сообщение от Хатобато Посмотреть сообщение
fputws(s,F1); // Выведено правильно
Что такое s1 и s?
Выкладывайте пожалуйста код полностью.

Добавлено через 18 минут
Цитата Сообщение от Хатобато Посмотреть сообщение
FILE *F=fopen("e:\\txt\\soi.txt","rt");
Также нужно понимать, что кодировка файла soi.txt должна быть в UTF-16 для вашего кода.

Нужно понимать и уметь различать:
1) Кодировку файла исходного текста, как выше уже было неоднократно сказано, для mingw\gcc это по умолчанию utf-8, и если хотите работать с L-строками, то нужно использовать именно utf-8.

2) Кодировку консоли, в которую выводятся ваши строки. В виндоус с этим все сложно, читайте здесь: Не выводятся wchar_t символы
и здесь (если у вас Windows 10):
Ввод с клавиатуры данных в массив
также вот эта тема может быть полезной:
Русский язык в консоли

3) Кодировку файла текста, который вы читаете через IO-функции С\С++. Эта кодировка должна соответствовать вашим ожиданиям и самое главное ожиданиям API-функций, в которые потом считанное из файла попадает. При необходимости возможно будет требоваться сделать преобразование кодировок.

Разбирайтесь. Последнее, что сейчас нужно вам - это поспешные выводы и решения без понимания сути.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 10:48  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Что такое s1 и s?
C++
1
2
wchar_t s[1000];
wchar_t s1[1000];

Как видите, берутся из файла.

Цитата Сообщение от Хатобато Посмотреть сообщение
fgetws(s,999,F);
Все остальные действия производятся с этой строкой и её копией s1.

И Вы видите, что достаточно было добавить "Дурь №" в строку формата, чтобы весь текст строки исчез...
Если вместо "Дурь №" написать что-то латиницей, строка будет выведена.

Также нужно понимать, что кодировка файла soi.txt должна быть в UTF-16 для вашего кода.
Файл - в UTF-16.

Ввода и вывода с консоли здесь вообще нет.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
29.03.2024, 12:14
Цитата Сообщение от Хатобато Посмотреть сообщение
И Вы видите, что достаточно было добавить "Дурь №" в строку формата, чтобы весь текст строки исчез...
Так может, проблема не в swprintf, а в виндовой консоли, у которой постоянно какие-то проблемы с русскими буквами?
Ввод с клавиатуры данных в массив
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
29.03.2024, 12:26
Цитата Сообщение от Хатобато Посмотреть сообщение
И Вы видите, что достаточно было добавить "Дурь №" в строку формата, чтобы весь текст строки исчез...
А вы посмотрите в отладочном режиме, "исчезла" ли строка, ещё можно записать её в файл.
COKPOWEHEU, вам уже на это намекнул, я просто указал как это легко проверить.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 12:27  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
ак может, проблема не в swprintf, а в виндовой консоли, у которой постоянно какие-то проблемы с русскими буквами?
Нет тут консоли! Ввод и вывод - из файлов.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
 
 
int pp=125;
 
wchar_t s[1000];
wchar_t s1[1000];
wchar_t s8[1000];
 
FILE *F=fopen("e:\\txt\\ekemeke_16.txt","rt");  // utf16
FILE *F8=fopen("e:\\txt\\ekemeke_8.txt","rt"); // utf8
 
FILE *F1=fopen("e:\\txt\\_ekemeke_1.txt","wt");
FILE *F2=fopen("e:\\txt\\_ekemeke_2.txt","wt");
 
fgetws(s,999,F);
fgetws(s8,999,F8);
 
 
fputws(s,F1);
fputws(s8,F2);
 
_swprintf(s1,L"%i. %s\n\n",pp,s);
fputws(s1,F1);
 
_swprintf(s1,L"%i. %s\n\n",pp,s8);
fputws(s1,F2);
 
fclose(F);
fclose(F1);
fclose(F2);
fclose(F8);
 
 
return 0;
 
 
}

Цитата Сообщение от DrOffset Посмотреть сообщение
кодировка файла soi.txt должна быть в UTF-16 для вашего кода.
А получается что-то обратное (на картинке)...
Строки, которые идут после _swprintf, не появились ни в одном из них. B c fwprintf - такая же проблема.
Миниатюры
swprintf в MinGW  
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 12:33  [ТС]
Только сейчас заметила, что на utf-16 образовался реверс! Откуда он взялся??? В исходном файле ekemeke_16.txt - нормальный текст!
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 12:42  [ТС]
Вариант с utf-16 BE в исходном
Миниатюры
swprintf в MinGW  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.03.2024, 12:42
Помогаю со студенческими работами здесь

Как заставить QTCreator при компиляции MinGW применять DLL от MinGW?
Как заставить QTCreator при компиляции MinGW применять DLL от MinGW? компилирую,с смотрю зависимости - Там DLL из директории MSVC2013....

Swprintf - Unhandled page fault on read Access
Из-за некоторых проблем, возникающих только под windows (см. предыдущую тему), пришлось использовать для windows тип wchar_t (строки...

MinGW, при установке ошибка: unpacking mingw-get-0.6.2-mingw32-beta-20131004-1-bin.tar.xz
Добрый день, форумчане! Недавно начал изучать Си, решил попрактиковаться. В качестве компилятора не знал какой выбрать (вообще не знаю,...

Правильное swprintf, правильное wprintf ?
Вродеж бы по ,,инструкции,,.... ..... wchar_t str = L&quot;tanya&quot;; // обозначает, что строка не однобайтная, а двуб ...

Qt 4.8.1 and MinGW 4.7.2
Здравствуйте форумчане! Мучает такой вопрос можно ли прикрутить MinGW 4.7 (с поддержкой С++) к Qt 4.8.1? Если да то как? ЗЫ.На...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru