Как печатать с выводом с правой стороны экрана вместо обычной левой стороны в C?

Я программирую игру, в которой мне нужно создать несколько блоков. Я отлично запрограммировал эту часть, но проблема в том, что они должны быть выровнены по направлению к правой стороне экрана, а не к обычной левой стороне. Теперь я знаю длительный подход к печати пробелов, но мне было просто любопытно, есть ли какой-нибудь ярлык для вывода вывода справа в C или C ++?

1

Решение

Если вы имеете в виду что-то похожее на стандартный вывод консоли (C ++), например, соиЬ,
Вы можете использовать либо это:

http://www.cplusplus.com/reference/ios/right/

или библиотека iomanip позволяет вам иметь ряд возможностей форматирования текста.
Например:

cout << setw(20) << setiosflags(ios::right) << "Hello World!" << endl;

http://www.cplusplus.com/reference/iomanip/

Не забудь #include <iomanip>,

О, и пожалуйста, обратите внимание, что для выравнивания вправо, я считаю, что вы должны установить ширину.

Надеюсь, поможет.

2

Другие решения

Сначала выясните, сколько столбцов на экране. Это зависит от платформы, для которой вы программируете; Я не могу вам помочь, потому что вы не указали платформу.

Для фактической печати вы можете использовать printf с Поле ширины спецификатор, который выравнивает ваш текст по ширине поля.

Для более сложных случаев взгляните на curses, всеобъемлющую библиотеку для терминального программирования.

0

В большинстве распространенных Unix-подобных платформ вы можете использовать ioctl системный вызов:

#include <sys/ioctl.h>
#include <stdio.h>

int main()
{
char *string = "Hello World";
struct winsize w;

ioctl(0, TIOCGWINSZ, &w);
printf("%*s\n", w.ws_col, string);
return 0;
}
0

Как отмечалось в других предлагаемых ответах, решение действительно зависит от типа системы, на которой выполняется программа, и, что более важно, от того, какой тип устройства отображает результат. Различия в выравнивании с использованием элементов управления форматированием (как в случае printf или cout), по сути, такие же, как и заполнение строки вывода пробелами, но с использованием более элегантного интерфейса программирования.

Двигаясь мимо них (поскольку они не соответствуют тому, что было запрошено), интересен тип устройства отображения. Графические дисплеи универсально позволяют размещать текст в любом месте (программируемого) устройства. Однако устройства с символьными ячейками, такие как терминал, делают его немного сложнее. Все, что вы, вероятно, будете использовать в системе POSIX, позволит вам писать текст на курсор положение, и изменить положение, в котором вы пишете текст, используя Курсор-адресации. (Консоли Windows предоставляют аналогичный интерфейс с различными деталями — поскольку система не указана, POSIX — это то, что большинство людей предполагает).

С помощью адресации курсора вы можете написать заданную строку, выровненную по правой стороне экрана, выполнив это:

  • найти ширину экрана, назовите это W,
  • найти длину строки, вызовите это L (на самом деле вам нужно количество ячейки на экране, который он будет использовать — длина строки UTF-8 в байтах отличается от ширина).
  • переместить курсор в камеру W - L на текущую строку экрана (считая с нуля).
  • напиши текст на экране

Хотя не является частью POSIX, TIOCGWINSZ Эта функция широко поддерживается и позволяет получить ширину экрана, например, Как установить размер терминала?. (Некоторые системы поддерживают аналогичный вызов с TIOCGSIZE символ, как отмечено в Как получить ширину терминала в С?).

Вместо того, чтобы перемещать курсор вдоль линии, записывая пробелы, можно выбрать меньшее количество символов в последовательность управления. Для перемещения курсора есть варианты:

  • Жесткий код последовательности управления, такой как HPA (горизонтальное положение, абсолютное). Не рекомендуется, но документация доступна, например, в Linux console_codes страница справочника или Управляющие последовательности XTerm. Этой последовательности не было в VT100, на которой основывались многие терминальные эмуляторы, но документировано в ISO-6429. XTerm добавил его в 1997 (нет документации для той эпохи в Linux).
  • использование TERMCAP спросить, поддерживает ли терминал HPA (называется "ch" в termcaps) или использовать CUF (курсор вперед) с параметром (но это требует, чтобы вы знали, где вы являются). Предположим, что терминал поддерживает HPAваша программа будет делать что-то вроде

    char *hpa = tgetstr("cm", &areap);
    tgoto(hpa, W - L, 0);
    puts(mystring);

  • использование проклятий, и пусть решает, как идти в нужное место

    int y, x;
    getyx(stdscr, y, x);
    move(y, W-L);
    addstr(mystring);

0
the following, some of the info found at: <http://wiki.bash-hackers.org/scripting/terminalcodes>
should greatly help you with handling the screen/cursor activities.

General useful ASCII codes

The Ctrl-Key representation is simply associating the non-printable characters from ASCII code 1 with the printable (letter) characters from ASCII code 65 ("A"). ASCII code 1 would be ^A (Ctrl-A), while ASCII code 7 (BEL) would be ^G (Ctrl-G). This is a common representation (and input method) and historically comes from one of the VT series of terminals.
Name    decimal octal   hex C-escape    Ctrl-Key    Description
BEL 7   007 0x07    \a  ^G  Terminal bell
BS  8   010 0x08    \b  ^H  Backspace
HT  9   011 0x09    \t  ^I  Horizontal TAB
LF  10  012 0x0A    \n  ^J  Linefeed (newline)
VT  11  013 0x0B    \v  ^K  Vertical TAB
FF  12  014 0x0C    \f  ^L  Formfeed (also: New page NP)
CR  13  015 0x0D    \r  ^M  Carriage return
ESC 27  033 0x1B    <none>  ^[  Escape character
DEL 127 177 0x7F    <none>  <none>  Delete character
Cursor handling
ANSI    terminfo equivalent Description
[ <X> ; <Y> H
[ <X> ; <Y> f   cup <X> <Y> Home-positioning to X and Y coordinates
:!: it seems that ANSI takes 1-1 as root while tput takes 0-0
[ H home    Home-positioning to root (0-0)
7   sc  Save current cursor position
8   rc  Restore current cursor position
:?: most likely a normal code like \b   cub1    move left one space (backspace)
VT100 [ ? 25 l  civis   switch cursor invisible
VT100 [ ? 25 h  cvvis   switch cursor visible
Erasing text
ANSI    terminfo equivalent     Description
[ K
[ 0 K   el  Clear line from current cursor position to end of line
[ 1 K   el1     Clear line from beginning to current cursor position
[ 2 K   el2:?:  Clear whole line (cursor position unchanged)
General text attributes
ANSI    terminfo equivalent Description
[ 0 m   sgr0    Reset all attributes
[ 1 m   bold    Set "bright" attribute
[ 2 m   dim Set "dim" attribute
[ 4 m   set smul unset rmul :?: Set "underscore" (underlined text) attribute
[ 5 m   blink   Set "blink" attribute
[ 7 m   rev Set "reverse" attribute
[ 8 m   invis   Set "hidden" attribute
Foreground coloring
ANSI    terminfo equivalent     Description
[ 3 0 m     setaf 0     Set foreground to color #0 - black
[ 3 1 m     setaf 1     Set foreground to color #1 - red
[ 3 2 m     setaf 2     Set foreground to color #2 - green
[ 3 3 m     setaf 3     Set foreground to color #3 - yellow
[ 3 4 m     setaf 4     Set foreground to color #4 - blue
[ 3 5 m     setaf 5     Set foreground to color #5 - magenta
[ 3 6 m     setaf 6     Set foreground to color #6 - cyan
[ 3 7 m     setaf 7     Set foreground to color #7 - white
[ 3 9 m     setaf 9     Set default color as foreground color
Background coloring
ANSI    terminfo equivalent     Description
[ 4 0 m     setab 0     Set background to color #0 - black
[ 4 1 m     setab 1     Set background to color #1 - red
[ 4 2 m     setab 2     Set background to color #2 - green
[ 4 3 m     setab 3     Set background to color #3 - yellow
[ 4 4 m     setab 4     Set background to color #4 - blue
[ 4 5 m     setab 5     Set background to color #5 - magenta
[ 4 6 m     setab 6     Set background to color #6 - cyan
[ 4 7 m     setab 7     Set background to color #7 - white
[ 4 9 m     setaf 9     Set default color as background color
Misc codes
Save/restore screen

Used capabilities: smcup, rmcup

You've undoubtedly already encountered programs that restore the terminal contents after they do their work (like vim). This can be done by the following commands:

# save, clear screen
tput smcup
clear

# example "application" follows...
read -n1 -p "Press any key to continue..."# example "application" ends here

# restore
tput rmcup

These features require that certain capabilities exist in your termcap/terminfo. While xterm and most of its clones (rxvt, urxvt, etc) will support the instructions, your operating system may not include references to them in its default xterm profile. (FreeBSD, in particular, falls into this category.) If `tput smcup` appears to do nothing for you, and you don't want to modify your system termcap/terminfo data, and you KNOW that you are using a compatible xterm application, the following may be work for you:

echo -e '\033[?47h' # save screen
echo -e '\033[?47l' # restore screenThe following is more specific to cursor placement:
<http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html>

- Position the Cursor:
\033[<L>;<C>H
Or
\033[<L>;<C>f
puts the cursor at line L and column C.
- Move the cursor up N lines:
\033[<N>A
- Move the cursor down N lines:
\033[<N>B
- Move the cursor forward N columns:
\033[<N>C
- Move the cursor backward N columns:
\033[<N>D

- Clear the screen, move to (0,0):
\033[2J
- Erase to end of line:
\033[K

- Save cursor position:
\033[s
- Restore cursor position:
\033[u
0
По вопросам рекламы [email protected]