10

我正在尝试在指定坐标的控制台中打印字符。到目前为止,我一直在使用非常丑陋的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:)

那么,你们有没有我要找的东西?

4

7 回答 7

14

诅咒是你正在寻找的东西。

于 2009-11-03T23:48:50.613 回答
13

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

编辑:如果您使用的是 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);
}
于 2009-11-03T23:51:25.623 回答
6

您正在做的是在纯 C++ 应用程序中使用一些非常终端特定的魔术字符。虽然这可行,但您可能会更轻松地使用一个库,该库使您不必处理特定于终端的实现细节并提供满足您需要的功能。

检查您的系统是否可以使用 curses 或 ncurses 库。

于 2009-11-03T23:50:18.787 回答
6

对您的功能的一些改进:

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而不打印换行符
  • 在格式字符串中使用xand (您对and的使用可能是错字)yxx

然而,因为可变参数本质上是一个 C 特性并且并不真正理解 C++ 对象,所以你必须这样称呼它:

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

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

于 2009-11-03T23:51:21.770 回答
4

第一的:

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

您不想复制字符串参数,而是希望通过 ( const) 引用传递它。char*此外,从 a获取 a 的(唯一)正确方法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++ 无法做你想做的事,但它允许你使用特定于平台的方法来做。您必须告诉我们您的平台才能获得有意义的答案。

于 2009-11-03T23:53:03.890 回答
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 这就是问题所在

于 2018-01-17T04:18:58.933 回答
-1

我有一点不同的方法。不确定这是否比 ncurses 包更好,所以我把它留给支持者来决定。

您可以使用C++ 中的Graphics包将文本输出到工作屏幕上的特定坐标。语法是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) 中打印Hello World 。

有关图形包可以做什么的参考,请访问此链接

于 2018-01-17T04:42:13.273 回答