Создайте функцию окна сообщений в консоли и передайте ей аргументы (текст)

#c #console #message

Вопрос:

Приведенный ниже код будет заключен std::string message в саморегулирующуюся коробку с двойной подкладкой, как в эпоху DOS старой школы.

Как я могу передать этой функции пользовательское текстовое сообщение, например Msg_Box(print this custom text); ?

 #include <iostream>
#include <string>

void Msg_Box()
{
    // Box edges and corners (all double thick line)
    // T for top, B for bottom, L for left, R for right
    const char TB = 'xCD'; // 205
    const char LR = 'xBA'; // 186
    const char TL = 'xC9'; // 201
    const char TR = 'xBB'; // 187
    const char BL = 'xC8'; // 200
    const char BR = 'xBC'; // 188

    std::string message = "To be, or not to be...";
    std::string margin = "  ";
    std::string line(message.length()   2 * margin.length(), TB);

    std::cout << TL << line << TR << std::endl;
    std::cout << LR << margin << message << margin << LR << std::endl;
    std::cout << BL << line << BR << std::endl;
    std::cout << std::endl;
    
}

int main()

{
        Msg_Box(); 
        return 0;
}
 

Ответ №1:

Хе-хе, ты уже проделал тяжелую работу! Вы можете передать такое сообщение :

 #include <iostream>
#include <string>
#include <sstream>

// pass a std::string to Msg_Box
// do it by reference to avoid copying.
// and make it const because you will
// not be changing the content of the string
void Msg_Box(const std::stringamp; message)
{
    // Box edges and corners (all double thick line)
    // T for top, B for bottom, L for left, R for right
    const char TB = 'xCD'; // 205
    const char LR = 'xBA'; // 186
    const char TL = 'xC9'; // 201
    const char TR = 'xBB'; // 187
    const char BL = 'xC8'; // 200
    const char BR = 'xBC'; // 188

    std::string margin = "  ";
    std::string line(message.length()   2 * margin.length(), TB);

    std::cout << TL << line << TR << std::endl;
    std::cout << LR << margin << message << margin << LR << std::endl;
    std::cout << BL << line << BR << std::endl;
    std::cout << std::endl;
}

int main()
{
    std::ostringstream os;
    os << "The answer is " << 42;
    Msg_Box(os.str());
    return 0;
}
 

Комментарии:

1. @Пепиджин Крамер Спасибо. Это работает. Побочные эффекты: самонастраивающаяся часть хороша только для одной строки текста. /n сломает поле.

2. Забавно, но это возвращает меня на 30 лет назад. Я думаю, что тогда я написал мини-оконные системы с использованием ascii-искусства (и цветов/теней). В каком-то смысле тогда это было проще, я мог получить доступ к частям экрана непосредственно в памяти.

3. @Пепиджин Крамер — еще один побочный эффект, который нельзя использовать с ‘<.. у вас есть какое-нибудь быстрое решение?

4. Да, в качестве быстрого решения используйте острингстрим. Я обновил пример.