Ожидаемый результат: распечатать текст соответствия регулярного выражения в окне

Инструменты: 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.

Спасибо за ваше время и внимание.

0
kbaud 29 Июл 2020 в 20:16
Если sendToReportWindow использует строки Unicode (на что указывает передача L"%s\n" в качестве строки формата, то %s нельзя использовать для форматирования строки ANSI. Вместо этого вам нужно использовать %hs. Прекратите использовать TCHAR и явно используйте Unicode.
 – 
Jonathan Potter
30 Июл 2020 в 06:02
Спасибо за ваш ответ. К сожалению, изменение вызова на sendToReportWindow(L"%hs\n", cm[i]); по-прежнему производит странные символы. что касается TCHAR, насколько я понимаю, компилятор выбирает соответствующую переменную?
 – 
kbaud
30 Июл 2020 в 23:06

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");
0
kbaud 3 Авг 2020 в 21:15