Как распечатать строку на консоли в определенных координатах на C++?

Я пытаюсь печатать символы в консоли в заданных координатах. До сих пор я использовал очень уродливый printf("3[%d;%dH%sn", 2, 2, "str"); но я просто должен был спросить, есть ли у C++ другой способ сделать это. Проблема даже не в том, что это уродливо, проблема возникает, когда я пытаюсь сделать себя более красивой функцией:

void printToCoordinates(int x, int y, string text)
{
    printf("3[%d;%dH%sn", x, x, text);
}

это не работает, даже если я набираю (char*). Другая проблема заключается в том, что я должен распечатать n для обновления страницы... Я просто не пользоваться printf в целом.

аналогично с использованием cout вместо printf, Я считаю, что должен быть более поздний способ сделать это (в идеале способ, который позволяет мне легко писать строки, где я хочу на экране, и в идеале способ, который не требует этих странных символов:3[%d;%dH)

так, кто-нибудь из вас есть то, что я ищу?

7 ответов


то, что вы делаете, использует некоторые очень терминальные магические символы в приложении c++. Хотя это работает, вам, вероятно, будет намного проще использовать библиотеку, которая абстрагирует вас от необходимости иметь дело с деталями конкретной реализации терминала и предоставляет функции, которые делают то, что вам нужно.

исследуйте, доступны ли для вашей системы библиотеки проклятий или ncurses.


проклятие это то, что вы ищете.


Я помню, с помощью gotoxy(x,y) в Turbo C++ (с попечительством.h) - не знаю, сработает ли это для вас. Он перемещает курсор к координатам, указанным x и y.

EDIT: если вы используете Windows, вот gotoxy клон:

#include <windows.h>

void gotoxy(int x, int y)
{
  COORD coord;
  coord.X = x;
  coord.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

первый:

void printToCoordinates(int x, int y, string text)
{
    printf("3[%d;%dH%s\n", x, x, text);
}

вы не хотите копировать строковый аргумент, вы хотите передать его (const) ссылкой. Кроме того, (единственный) правильный способ получить char* С std::string называть его c_str() функции:

void printToCoordinates(int x, int y, const std::string& text)
{
    printf("3[%d;%dH%s\n", x, x, text.c_str());
}

что касается вашего вопроса: C++ не имеет возможности делать то, что вы хотите, но позволяет использовать специфические для платформы способы сделать это. Вам придется рассказать нам о своей платформе, чтобы получить содержательные ответы.


несколько улучшений для функции:

void printToCoordinates(int x, int y, const char *format, ...)
{
    va_list args;
    va_start(args, format);
    printf("3[%d;%dH", x, y);
    vprintf(format, args);
    va_end(args);
    fflush(stdout);
}

такой вариант:

  • позволяет использовать любые строки произвольного формата и списки переменных аргументов
  • автоматически сбрасывает stdout без печати новой строки
  • использует x и y в строке формата (использование x и x возможно, опечатка)

однако, потому что varargs по существу является функцией C и на самом деле не понимает Объекты c++, вы должны были бы назвать это так:

printToCoordinates(10, 10, "%s", text.c_str());

лучшим вариантом действительно является использование проклятий (для Unix-подобных платформ) или консольных функций Win32 (для Windows), как указано в других ответах.


void screenpos(int x,int y,char textyowanawrite[20])
{
//printf for right shift
// \n for downward shift
//loops through the rows and shifts down 
for(int row=0;row<=y;row++)
{
printf("\n");
for (int i = 0; i < x; i++)
{
printf("%s "," " );
}
}
printf("%s ",textyowanawrite );
} 

//это должно работать до определенной вымершей проблемы, только вы не можете перейти от где-то, как 4,4 до 2,2, это проблема


у меня немного другой способ. Не уверен, что это лучше, чем пакет ncurses, поэтому я оставляю это на усмотрение upvoters.

можно использовать графика пакет на C++ для вывода текста в определенную координату на рабочем экране. Синтаксис outtextxy(x, y, text) ; Где x & y-координаты.

пример:

int main(void) {

    int gdriver = DETECT, gmode;

    int x = 200, y = 200;

  

    initgraph(&gdriver, &gmode, "c:\tc\bgi");

  

    outtextxy(x, y, "Hello World");

    closegraph();

 }

эта маленькая программа для печати Привет, Мир в точки с координатами (200,200).

для ссылка на то, что графический пакет, можно ли посетить этой ссылке