Вывод переменной в середине текста MessageBox

142
21 января 2019, 18:20

В char WindowText[4096] хранится заголовок окна (не окна с сообщением), полученный при помощи GetWindowText. Когда я пытаюсь сделать так:

MessageBoxA(0, "Window Text = '"+ WindowText +"'! Some Text", "Some Title", MB_ICONERROR | MB_OK);

То получаю: И:

Что делать?

Answer 1

Например, вот как-нибудь так:

#include <string>
#include <iostream>
#include <windows.h>
int main()
{
    std::string sl;
    char WindowText[4096] = "***";
    sl = "Window Text = '";
    sl += WindowText;
    sl += "'! Some Text";
    MessageBoxA(0, sl.c_str(), "Some Title" ,MB_ICONERROR | MB_OK);     
    return 0;
}

UPD: По просьбе коллеги немного дополню ответ. Раз в вопросе был указан тег С++, то я привожу пример с наиболее простыми конструкциями из этого языка с максимальным сохранением сущностей из вопроса (конечно, лучше было бы все строки заменить на тип std::string). И естественно, это не единственно возможный вариант.

В С++ для пользовательских типов данных, и в частности, для классов и структур, можно переопределять (перегружать) поведение стандартных операций. В случае с классом string из стандартной библиотеки шаблонов, оператор ++=) переопределен для конкатенации таких строк с объектами такого же типа и со строками в стиле языка Си. Чтобы компилятор мог воспользоваться этим перегруженным оператором необходимо, чтобы хотя бы один из двух операндов принадлежал этому типу string.

Если же оставаться в рамках стандартной библиотеки языка Си, то можно было воспользоваться уже упомянутыми мной в комментариях функциями для формирования строки sprintf()/snprintf(), упомянутыми Harry функциями для конкатенации строк strcat()/strncat() и даже функциями для копирования/перемещения строк strcpy()/strncpy()/memcpy()/memmove(). Предпочтение следует отдавать тем вариантам функций, где в именах есть буква n (это не касается memcpy()/memmove(), т.к. в них тоже надо явно указывать размер) - эти функции, как бы (в смысле предоставляют возможность, а остальное зависит от программиста), защищены от ошибок переполнения, поскольку нужно явно указывать размер целевого блока памяти.

Answer 2

В С/С++ конкатенация строк с помощью знака + имеет смысл, если это строки типа string. Если это C-сроки (как ваши литералы типа "Window Text = '" или переменная WindowText, объявленная как массив char), то они интерпретируются как указатели на первые символы, а суммирование указателей - нонсенс, о чем вам и поведал компилятор.

Для этого нужно использовать функции наподобие strcpy, strcat и иже с ними. Например,

char buf[5120] = "Window Text = '";
strcat(buf, WindowText);
strcat(buf,"'! Some Text");
MessageBoxA(0, buf, ....
Answer 3

Я сделал так:

sprintf(Message, "%s%s%s", "Window Text = '", WindowText +"'! Some Text");
MessageBoxA(0, Message, "Some Title", MB_ICONERROR | MB_OK);

Но можно делать также как и в других ответах.

Всем большое спасибо!

READ ALSO
с++: возвращение типа, а не переменной

с++: возвращение типа, а не переменной

Подскажите (что-то не могу найти, хотя точно помню, что такая элементарная вещь в C++ была) как вернуть не переменную, а ее тип, который я дальше...

137
c++ реализация контейнера с итератором для доступа к данным, хранящимся в файле

c++ реализация контейнера с итератором для доступа к данным, хранящимся в файле

Поскольку когда мучаю читателей этого сайта мелкими задачами и часто возникает вопрос "зачем", то решил описать сразу и большую задачу, с которой...

152
Помогите составить код с операторами switch,break,goto

Помогите составить код с операторами switch,break,goto

Сейчас делаю задачу из интернета,основная цель используя оператор switch, составить программу для получения таблицы значений функции У для...

172