我正在尝试在控制台中的指定坐标处打印字符。到目前为止,我一直在使用非常丑陋的
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
)
那么,你们有我要找的东西吗?
诅咒就是您正在寻找的。
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);
}
您正在做的是在纯 C++ 应用程序中使用一些非常特定于终端的魔术字符。虽然这有效,但您可能会更轻松地使用一个库,该库使您不必处理终端特定的实现细节,并提供满足您需要的函数。
调查curses 或ncurses 库是否适用于您的系统。
对您的功能的一些改进:
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),如其他答案中提到的。
第一:
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++没有办法做你想做的事,但它允许你使用特定于平台的方法来做到这一点。您必须告诉我们您的平台才能获得有意义的答案。
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 包更好,所以我将其留给支持者来决定。
您可以使用 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。
有关图形包可以做什么的参考,请访问此链接