【问题标题】:How can I print a string to the console at specific coordinates in C++?如何在 C++ 中的特定坐标处将字符串打印到控制台?
【发布时间】:2010-12-12 20:32:32
【问题描述】:

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

那么,你们中有人有我要找的吗?

【问题讨论】:

  • 你在哪个平台上工作?
  • Ubuntu 9.04,我用g++编译

标签: c++ printf coordinates cout


【解决方案1】:

Curses 就是你要找的东西。

【讨论】:

  • 我找不到访问诅咒的内容。我也找不到 API 的任何文档..
【解决方案2】:

我记得在 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);
}

【讨论】:

  • STD_OUTPUT_HANDLE 中有一个空格。请务必将其删除。
【解决方案3】:

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

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

【讨论】:

    【解决方案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 可能是错字)

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

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

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

    【讨论】:

    • 什么是 fflush(stdout);部分做?
    • 通常 stdout 是“缓冲的”,这意味着 C 运行时库会将您打印的内容排队,并且仅在 (a) 您输出换行符、(b) 队列已满或(c) 您手动刷新文件。在这种情况下使用fflush() 比打印换行符更直接和明显(如果您尝试在屏幕的底行打印内容,它将防止滚动问题)。
    【解决方案5】:

    第一:

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

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

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

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

    【讨论】:

    • 应该是 printf(...., x, y, text);不是 printf(...,x,x,text) .. 上面不能编辑。
    【解决方案6】:
    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 这样的地方就是问题

    【讨论】:

      【解决方案7】:

      我有一点不同的方法。不确定这是否比 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

      有关图形包可以做什么的参考,请访问this link

      【讨论】:

      • 图形包是非标准的,在 Ubuntu,OP 的平台上可能不可用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多