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

swprintf в MinGW

20.07.2023, 10:51. Показов 5104. Ответов 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
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
20.07.2023, 11:06
C++
1
swprintf(s, 300, L"%i",i);
0
97 / 73 / 27
Регистрация: 30.03.2023
Сообщений: 201
20.07.2023, 11:08
Ты не замечаешь того, что в качестве format передаешь const char*, а не const wchar_t*

C++
1
swprintf(s, L"%i",i);
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
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
Заблокирован
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
29.03.2024, 12:14
Цитата Сообщение от Хатобато Посмотреть сообщение
И Вы видите, что достаточно было добавить "Дурь №" в строку формата, чтобы весь текст строки исчез...
Так может, проблема не в swprintf, а в виндовой консоли, у которой постоянно какие-то проблемы с русскими буквами?
Ввод с клавиатуры данных в массив
0
Заблокирован
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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru