Как распечатать строку на консоли в определенных координатах на 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).
для ссылка на то, что графический пакет, можно ли посетить этой ссылке