2009-11-03 222 views
5

我試圖在指定的座標處在控制檯中打印字符。到目前爲止,我一直在使用非常醜陋的printf("\033[%d;%dH%s\n", 2, 2, "str");但我只是問C++是否有其他方式來做這件事。這個問題甚至不是它的醜陋,問題就來了,當我努力讓自己像這麼漂亮的功能:如何在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

那麼,你們有沒有找到我想要的東西?

+1

你在哪個平臺上工作? – Jacob 2009-11-03 23:49:24

+0

Ubuntu 9.04,我使用g ++來編譯 – Shawn 2009-11-03 23:58:28

回答

5

你在做什麼是在一個純C++應用程序中使用一些非常終端特定的魔法字符。雖然這有效,但使用一個庫可以讓你更容易得到它,從而不必處理終端特定的實現細節,並提供了所需的功能。

調查curses或ncurses庫是否可用於您的系統。

11

Curses是你在找什麼。

+2

或新的veriant nCurses。 – 2009-11-03 23:56:44

+0

我找不到要訪問curses的內容。我也沒有找到API的任何文檔。 – Shawn 2009-11-04 00:01:17

+1

@Shawn:'man ncurses'本來會告訴你'' – MSalters 2009-11-04 15:56:36

2

給你的函數的一些改進:

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)。

+0

fflush(stdout);部分呢? – Shawn 2009-11-03 23:59:26

+0

通常,標準輸出爲「緩衝」,這意味着C運行時庫將您打印的內容排隊,並且只在(a)輸出換行符時,(b)隊列填滿時,或者(c)手動刷新文件。在這種情況下使用'fflush()'比打印新行更直接明瞭(如果你試圖在屏幕底部打印東西,它將防止滾動問題)。 – 2009-11-04 00:32:47

8

我記得在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); 
} 
+0

'STD_OUTPUT_HANDLE'中有一個空格。一定要刪除它。 – Aistis 2016-12-26 11:26:09

3

第一:

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++有沒有辦法做你想做的,但它可以讓你使用平臺特定的方式來做到這一點。您必須告訴我們您的平臺才能獲得有意義的答案。

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包好,所以我留給那些upvoters來決定。

您可以使用圖形封裝在C++中將文本輸出到工作屏幕上的特定座標。 語法是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(); 

} 

這個小程序將打印的Hello World在座標(200,200)。

對於什麼圖形包可以做訪問this link

+0

圖形包是非標準的,可能在Ubuntu上不可用,OP的plateforml – 2018-01-17 05:44:04

相關問題