Ожидаемый результат: распечатать текст соответствия регулярного выражения в окне
Инструменты: Visual Studio 2019
Язык: C ++, Windows API
Сообщение об ошибке: Обычно я получаю странные символы (как в приведенном ниже примере), что, как я понимаю, вероятно, является проблемой преобразования Unicode. Иногда я также получаю различные сообщения, в зависимости от того, какой метод я использую для повреждения языка. Обычно, насколько я могу судить, это проблема несоответствия типов.
Отладчик: в отладчике я вижу, что переменные имеют удобочитаемые значения (которые понимает IDE), но они просто не попадают в окно, которое выглядит так.
Вещи, которые я пробовал: гуглил и читал часами. различные преобразования типов. Также вариации на MultiByteToWideChar, разные типы соответствия s / m / ws и т. Д.
Я перепробовал около 6 вариантов. Я определенно могу опубликовать больше таких, если хотите! В этой версии в окне появляются странные символы:
const char mystr[] = "SoftwareTestingHelp";
cmatch cm; // match results for string literals
regex str_expr("(soft)(.*)");
regex_match(mystr, cm, str_expr, regex_constants::match_default);
sendToReportWindow(L"%s\n", cm[1]);
Эта версия дает ошибку несоответствия типа для cm и LPCCH и не будет компилироваться:
TCHAR buffer[500] = { 0 };
const char mystr[] = "SoftwareTestingHelp";
cmatch cm; // match results for string literals
regex str_expr("(soft)(.*)");
regex_match(mystr, cm, str_expr, regex_constants::match_default);
MultiByteToWideChar(CP_ACP, MB_COMPOSITE, cm[1], -1, buffer, 500);
sendToReportWindow(L"%s\n", buffer);
Функция, которую я использую для печати в графическом интерфейсе:
void sendToReportWindow(const TCHAR format[], ...) // overloaded function. this version accepts printf style
{
va_list(arglist);
va_start(arglist, format);
wchar_t text_buffer[256] = { 0 }; // temporary buffer. change to dynamically sized based on size of inputs? memory is cheap.
vswprintf(text_buffer, 256, format, arglist); // convert using printf. vsw version can handle wide, va_lists from parent function arguments
SendMessage(Report, EM_SETSEL, -1, -1);
SendMessage(Report, EM_REPLACESEL, 0, (LPARAM)text_buffer);
}
Я мог бы добавить больше отчетов об ошибках, но IDE и вывод программы говорят мне, что это проблема преобразования Unicode.
Спасибо за ваше время и внимание.
1 ответ
Нашел ответ здесь: https://stackoverflow.com/a/35348217/14017267
Рабочий код:
#include<regex>
...
wstring target(L"The answer is blowing in the wind");
wsmatch wideMatch;
wregex wrx(L".+(answer).+");
sendToReportWindow(L"text to search using regex:%s\n", target.c_str());
if (regex_match(target.cbegin(), target.cend(), wideMatch, wrx))
{
sendToReportWindow(L"The matching wide text is:%s\n",wideMatch[1].str().c_str());
}
В качестве дополнительной награды, вот пример логической индикации совпадения:
bool found = regex_match(target.cbegin(), target.cend(), wrx);
if (found)
sendToReportWindow(L"match found in input text\n");
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
sendToReportWindow
использует строки Unicode (на что указывает передачаL"%s\n"
в качестве строки формата, то%s
нельзя использовать для форматирования строки ANSI. Вместо этого вам нужно использовать%hs
. Прекратите использоватьTCHAR
и явно используйте Unicode.