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

问题描述 投票:0回答:7

我正在尝试在控制台中的指定坐标处打印字符。到目前为止,我一直在使用非常丑陋的

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

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

c++ printf coordinates cout
7个回答
15
投票

诅咒就是您正在寻找的。


14
投票

我记得在 Turbo C++ (conio.h) 中使用过

gotoxy(x,y)
- 但不知道它是否适合你。它将光标移动到由
x
y
指定的坐标。

编辑: 如果您使用的是 Windows,这里有一个

gotoxy
克隆:

#include <windows.h>

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

7
投票

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

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


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
    而不打印换行符
  • 在格式字符串中使用
    x
    y
    (您使用
    x
    x
    可能是一个拼写错误)

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

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

更好的选择确实是使用curses(对于类Unix平台)或Win32控制台函数(对于Windows),如其他答案中提到的。


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++没有办法做你想做的事,但它允许你使用特定于平台的方法来做到这一点。您必须告诉我们您的平台才能获得有意义的答案。


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 之类的地方就是问题所在


-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

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

© www.soinside.com 2019 - 2024. All rights reserved.