В char WindowText[4096]
хранится заголовок окна (не окна с сообщением), полученный при помощи GetWindowText
. Когда я пытаюсь сделать так:
MessageBoxA(0, "Window Text = '"+ WindowText +"'! Some Text", "Some Title", MB_ICONERROR | MB_OK);
То получаю: И:
Что делать?
Например, вот как-нибудь так:
#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()
, т.к. в них тоже надо явно указывать размер) - эти функции, как бы (в смысле предоставляют возможность, а остальное зависит от программиста), защищены от ошибок переполнения, поскольку нужно явно указывать размер целевого блока памяти.
В С/С++ конкатенация строк с помощью знака +
имеет смысл, если это строки типа string
. Если это C-сроки (как ваши литералы типа "Window Text = '"
или переменная WindowText
, объявленная как массив char
), то они интерпретируются как указатели на первые символы, а суммирование указателей - нонсенс, о чем вам и поведал компилятор.
Для этого нужно использовать функции наподобие strcpy
, strcat
и иже с ними. Например,
char buf[5120] = "Window Text = '";
strcat(buf, WindowText);
strcat(buf,"'! Some Text");
MessageBoxA(0, buf, ....
Я сделал так:
sprintf(Message, "%s%s%s", "Window Text = '", WindowText +"'! Some Text");
MessageBoxA(0, Message, "Some Title", MB_ICONERROR | MB_OK);
Но можно делать также как и в других ответах.
Всем большое спасибо!
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите (что-то не могу найти, хотя точно помню, что такая элементарная вещь в C++ была) как вернуть не переменную, а ее тип, который я дальше...
Здравствуйте!
Поскольку когда мучаю читателей этого сайта мелкими задачами и часто возникает вопрос "зачем", то решил описать сразу и большую задачу, с которой...
Сейчас делаю задачу из интернета,основная цель используя оператор switch, составить программу для получения таблицы значений функции У для...