如何在C ++的特定坐标处将字符串打印到控制台?

时间:2009-11-03 23:46:21

标签: c++ printf coordinates cout

我正在尝试在控制台中以指定的坐标打印字符。到目前为止,我一直在使用非常丑陋的printf("\033[%d;%dH%s\n", 2, 2, "str");但我不得不问C ++是否还有其他方法可以做到这一点。这个问题甚至不是很难看,当我试图让自己成为一个更漂亮的功能时问题出现了:

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

即使我对(char*)进行了类型转换,它也不起作用。 另一个问题是我必须打印出要更新的页面的\n ...我一般不喜欢使用printf

类似于使用cout代替printf,我相信应该有一种更近期的方法(理想情况下,这种方式可以让我轻松地在屏幕上写出我想要的字符串,并且理想情况下,这种方式不需要这些奇怪的符号:\033[%d;%dH

那么,你们中的任何人都有我想要的东西吗?

7 个答案:

答案 0 :(得分:12)

Curses正是您要找的。

答案 1 :(得分:11)

我记得在Turbo C ++(conio.h)中使用gotoxy(x,y) - 不知道它是否适合你。它将光标移动到xy指定的坐标。

编辑:如果您使用的是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);
}

答案 2 :(得分:4)

您正在做的是在纯C ++应用程序中使用一些非常终端的特定魔术字符。虽然这很有效,但您可能会更容易使用一个库来抽象您不必处理终端特定的实现细节,并提供满足您需要的功能。

调查curses或ncurses库是否适用于您的系统。

答案 3 :(得分:4)

对您的功能进行了一些改进:

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

此版本:

  • 允许您使用任意格式的字符串和变量参数列表
  • 自动刷新stdout而不打印换行符
  • 在格式字符串中使用xy(您使用xx可能是拼写错误)

但是,因为varargs本质上是一个C功能而且并不真正理解C ++对象,所以你必须这样称呼它:

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

更好的选择是使用curses(适用于类Unix平台)或Win32控制台功能(适用于Windows),如其他答案中所述。

答案 4 :(得分:4)

第一:

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

您不想复制字符串参数,而是希望通过(const)引用传递它。此外,从char*获取std::string的(唯一)正确方法是调用其c_str()成员函数:

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

关于你的问题:C ++无法做你想做的事,但它允许你使用特定于平台的方法来做到这一点。您必须告诉我们您的平台才能获得有意义的答案。

答案 5 :(得分:0)

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这个问题

答案 6 :(得分:-1)

我有一个不同的方法。不确定这是否比ncurses包更好,所以我留给那些由upvoters来决定。

您可以在C ++中使用图形包将文本输出到工作屏幕上的特定坐标。 语法为outtextxy(x, y, text) ; 其中x&amp; 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)中打印 Hello World

有关图形包可以执行的参考,请访问this link