Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344

Как передать текст из поля ввода в массив символов?

24.01.2023, 04:07. Показов 4775. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую. Когда я передаю строку так:
C++
1
2
char cmd[256];
            snprintf(cmd, sizeof(cmd), "@metaparser \"%s\"", CT2A(textIn));
Вроде всё работает,но когда я это делаю через someEdit.GetWindowTextW(textIn),т.е заношу текст в CString переменную и выполняю вышеуказанный код,у меня некорректно передаётся юникодовская строка. Подскажите пожалуйста,как это исправить? Может это баг,который нужно зарепортить в microsoft? Заранее всем огромное спасибо за помощь.

Добавлено через 1 час 51 минуту
Неужели все знающие visual c++ вымерли,или вымерли только знающие c++ на cyberforum.ru?

Добавлено через 5 часов 41 минуту
Подскажите пожалуйста,хотя бы,как правильно зарепортить этот баг в microsoft,т.к раньше я не репортил багов в microsoft.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.01.2023, 04:07
Ответы с готовыми решениями:

Как передать значение поля ввода в переменную?
<input type="text" name="timeend" class="tcal" value="" /> нужно передать timeend в java script Добавлено через 20 минут ...

Как передать переменную типа char из поля ввода в лист?
//Как передать переменную из типа char TextForList; из поля ввода в лист C++ WINAPI? #include <Windows.h> #include <string> ...

Как выводить и проверять текст из поля ввода?
Есть код, который проверяет введенный текст из поля ввода с текстом который в программе, но задача состоит в следующем: пользователь вводит...

25
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
24.01.2023, 07:03
КАВ, нет там никаких багов. Получаешь строку

C++
1
2
CString txt;
someEdit.GetWindowText(txt);
в зависимости и от настроек проекта (ansi/unicode) алиас CString является либо CStringA, либо CStringW

далее конвертируй в нужную кодировку при помощи
MultiByteToWideChar
WideCharToMultiByte
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
24.01.2023, 14:52  [ТС]
Огромное Вам спасибо. А почему не работает макрос CT2A,который вроде работает для обычной строки CString. Как узнать,что у меня используется - CStringA или CStringW? Какой вариант предпочтительнее?

Я делаю так:
C++
1
2
3
CString textIn;
someEdit.GetWindowTextW(textIn);
            snprintf(cmd, sizeof(cmd), "@metaparser \"%s\"", CT2A(textIn));
Я пробовал заменять CT2A на CT2W,но это не помогло.
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
24.01.2023, 14:55
Цитата Сообщение от КАВ Посмотреть сообщение
почему не работает макрос CT2A
я не в курсе, что это. Не встречал/не пользовался.

Цитата Сообщение от КАВ Посмотреть сообщение
Как узнать,что у меня используется
посмотреть в настройках проекта - Configuration properties - Advanced - Character Set -

или прыгнуть к определению идентификатора CString

Цитата Сообщение от КАВ Посмотреть сообщение
Какой вариант предпочтительнее
зависит от задачи
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
24.01.2023, 19:02  [ТС]
У меня в проекте вроде используется юникод. CT2A и ct2W это макросы,которые есть,как я понимаю,в mfc. Вот я и хочу зарепортить баг,что они не работают как следует.

Добавлено через 3 часа 44 минуты
Оказывается мне нужна функция,переводящая CString в char* utf8. В проекте (изначально это был не мой проект) Есть такая функция,правда во-первых она возвращает std::string,а мне нужен char*,а во-вторых я не уверен,что это наилучший вариант,т.к в нете видел прилично функций,переводящих из CString в char utf8 . А какая наиболее правильная - Вопрос.
C++
1
2
3
4
5
6
7
8
static std::string utf8_encode(const std::wstring& wstr)
{
    if (wstr.empty()) return std::string();
    int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    return strTo;
}
Добавлено через 2 минуты
Обидно,что mfc не предоставляет готовую функцию для этих целей.
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
24.01.2023, 19:54
Цитата Сообщение от КАВ Посмотреть сообщение
она возвращает std::string,а мне нужен char*
в классе есть метод c_str()
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
24.01.2023, 21:24  [ТС]
Я понял. просто для этого нужно объявлять отдельную переменную cString,а я видел в интернете функции,которые сразу конвертируют строку в utf-8 и возвращают массив символов,правда какие из них более правильные - вот в чём вопрос. Если я не найду ответ,придётся использовать то,что до меня писали в этом проекте (см код выше). Также как потом правильно прибавлять к ней что-либо,т.е чтобы,к примеру,написать "@metaparser %s",command где command - Массив символов,переконвертированный в utf-8.
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
24.01.2023, 21:50
КАВ, std::string - это и есть массив символов, только в удобной обёртке.

Добавлено через 1 минуту
если нужно работать с utf8, то внутри программы всё удобно будет держать в std::string. CString вообще не особо нужен, он лишь как промежуточное средство при отображении на экран или считывании из окна ввода
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
24.01.2023, 22:28  [ТС]
А почему в окне или в полях ввода не используется wstring,

Добавлено через 5 минут
И как всё-таки правильно переводить из cstring в массив символов utf-8 с возможностью добавлять строки,используя print,snprintf и т.д?
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
24.01.2023, 22:56
Цитата Сообщение от КАВ Посмотреть сообщение
А почему в окне или в полях ввода не используется wstring,
в MFC ? Ну, они написали свою строку и использовали её Но всегда можно юзать винапи напрямую и пользоваться std::string/std::wstring

Цитата Сообщение от КАВ Посмотреть сообщение
И как всё-таки правильно
для меня удобно так - конвертировать в STL-контейнеры и дальше пользоваться ими и их функциями. CString - это всего лишь необходимый промежуточный костыль при работе с некоторыми MFC-функциями
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
25.01.2023, 00:14  [ТС]
Хорошо. А как сконвертировать CString в stl контейнер. Как потом сконвертировать его в utf-8 и можно ли изменить этот массив,т.е не пострадает ли кодировка,если я буду использовать что-то типа "@metaparser %s"",т.е модифицировать этот символьный массив и можно ли как-то изменить существующий массив,или лучше распечатать модифицированный массив в другой массив (snprintf(cmd, sizeof(cmd), "@metaparser "%s"",utf8Array)).
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
25.01.2023, 00:25
КАВ, из CStringW можно сразу конвертировать в std::string, содержащий utf8 (пост №5 - чуток переделать код)

форматирование нужно будет делать методами класса std::ostringstream . Всё добавляемое в строку делать сразу в utf8
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
25.01.2023, 00:37  [ТС]
А как изменить мой код,чтобы сделать это напрямую? Просто я толком не знаю c++ и пишу,в основном,на java/python. А тут нужно доработать для себя и для других один c++ проект. Не могли бы Вы пожалуйста написать пример,как это правильно делать в 2023 году,т.к сейчас многое поменялось чем,к примеру,10-12 лет назад.
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
25.01.2023, 07:20
КАВ, например
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::string utf8_encode(const CStringW srcW)
{
    std::string utf8;
 
    if(!srcW.IsEmpty())
    {
        auto size = ::WideCharToMultiByte(CP_UTF8, 0, srcW.GetString(), srcW.GetLength(), 0, 0, 0, 0);
        utf8.resize((size_t)size, {});
        ::WideCharToMultiByte(CP_UTF8, 0, srcW.GetString(), srcW.GetLength(), utf8.data(), utf8.size(), 0, 0);
    }
    return utf8;
}
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
25.01.2023, 15:30  [ТС]
Огромное спасибо. Теперь вопрос как правильно это использовать,я имею ввиду после того,как я выполню форматирование и другие вещи,не нужно ли мне как-то освободить эту переменную?
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
25.01.2023, 15:38
КАВ, это класс, он сам умеет освобождать свои ресурсы
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
25.01.2023, 16:06  [ТС]
А разве не надо будет вызвать диструктор,или что-то типа delete string. Кстати интересно,а если бы мы работали в c,а не в c++,надо было бы освобождать string,или структура тоже сама освободила бы свои данные. Если Вам нетрудно,не могли бы Вы пожалуйста написать метод и обратно конвертирующий char* в строку utf-8. Просто у Вас он,на мой взгляд,будет лучше чем тот,что был реализован в проекте. Кстати функция resize пересчитывает размер памяти,который нужно выделить для переменной?
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
25.01.2023, 16:11
Цитата Сообщение от КАВ Посмотреть сообщение
А разве не надо будет вызвать диструктор,или что-то типа delete string
это объект на стеке, он автоматический

вот если объект создаётся при помощи new, то нужно будет вызвать delete

Цитата Сообщение от КАВ Посмотреть сообщение
если бы мы работали в c
в C нет конструкторов и деструкторов, всё вручную

метод resize устанавливает размер внутреннего буфера

Цитата Сообщение от КАВ Посмотреть сообщение
конвертирующий char* в строку utf-8.
а "char*" то в какой кодировке?
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
25.01.2023, 19:08  [ТС]
Насчёт c понятно. Просто я думал,что структура сама всё освободит. А насчёт кодировки неуверен,но вроде массив в utf-8.

Добавлено через 1 час 51 минуту
По сути мне нужна функция,которая делает обратное тому,что Вы написали.
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
25.01.2023, 19:45
КАВ, что-то навроде такого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
CStringW utf8_to_utf16(const std::string_view utf8)
{
    CStringW utf16;
    if(!utf8.empty() && utf8.size()<=(size_t)(std::numeric_limits<int>::max)())
    {
        if(const auto size=::MultiByteToWideChar(CP_UTF8,0,utf8.data(),(int)utf8.size(),0,0); size>0)
        {
            utf16=CStringW{L'\0',size};
            ::MultiByteToWideChar(CP_UTF8,0,utf8.data(),(int)utf8.size(),utf16.GetBuffer(),utf16.GetLength());
        }
    }
    return utf16;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.01.2023, 19:45
Помогаю со студенческими работами здесь

Как вывести текст из поля ввода (edit) в f1book?
у меня есть функция, которую я ввожу в edit, потом хочу , чтобы эта функция отображалась в f1book. И если не сложно как сделать , чтобы она...

Как считать текст из txt файла и вставить его в компонент webbrowser в поля ввода (авторизация)
help mee

Передать значение поля ввода в запрос
Всем доброго времени суток! Дайте, пожалуйста, идею в реализации задачи: В отчет по оборотам денежных средств (сделан с помощью...

Передать данные из поля ввода в программу
Добрый день! Есть программа для запроса выписок из Росреестра. Программа без GUI. Захотелось сделать интерфейс для ввода...

Текст из поля ввода в список
Решите задачу: напишите программу по следующему описанию. Нажатие Enter в однострочном текстовом поле приводит к перемещению текста из...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru