Невозможно напечатать многострочные строки в C

Я пытаюсь напечатать серию многострочных строк (здесь буквы ascii art), и при их печати верхняя часть каждой буквы перемещается вправо, а остальная часть буквы остается в том же положении. Вот скриншот того, что происходит: Изображение-ошибки

Я не знаю, почему это происходит, так как я новичок в C; если у вас есть какие-либо знания об этом, пожалуйста, поделитесь ими!


#include <stdio.h>
#include <curses.h>

typedef const char letter[];


letter Y = 
"___      __\n
\\ \\__ / /\n
 \\ \\ / /\n
 |  |  |\n
 |  |  |\n
 |__|__|\n";

letter O =  
"_______ \n
/   __ \\\n
|  |  | |\n
|  |__| |\n
\\_______/\n";

letter U = 
" __    __ \n
 / |   | \\\n
|  |   |  |\n
|   \\_/   |\n
\\_________/\n";

letter L = 
" _\n"
"| |\n"  
"| |\n"
"| |__\n"
"|____/\n";

letter S =
" _________\n"
"/   _____/\n"
"\\_____  \\\n"
"/        \\\n"
"/_______  /\n"
"        \\/\n";

letter T =
"___________\n"
"\\__    ___/\n"
"   |   |\n"
"   |   |\n"
"   |___|\n";

letter EXCLAMATION_POINT =
"_________\n"
"\\\\\\\\|////\n"
" \\\\\\|///\n"
"  \\\\|//\n"
"   \\|/\n"
"   ***\n"
"   ***\n"
"    *\n";

const char *MESSAGE[] = {Y, O, U, L, O, S, T, EXCLAMATION_POINT};

int main() {
    initscr();
    cbreak();
    noecho();

    int maxY, maxX;
    getmaxyx(stdscr, maxY, maxX);

    int spacingPerLetter = maxX / 8;
    
    for (int i = 0; i < 8; i++) {
        mvprintw(maxY / 2, spacingPerLetter * (i + 1), MESSAGE[i]);
        refresh();
        getch();
        clear();
    }

    endwin();
    return 0;
}

person Caspian Ahlberg    schedule 08.07.2020    source источник
comment
Буквы y, o и u имеют много пробелов после новой строки. Остальные нет. Почему разница?   -  person William Pursell    schedule 08.07.2020
comment
mvprintw перемещается в середину строки перед печатью. Затем он печатает MESSAGE[i] (которое включает несколько строк текста). Таким образом, пустые строки исходят из файла maxY / 2. Измените это на 0.   -  person William Pursell    schedule 08.07.2020
comment
Вы не можете сломать такое строковое объявление. (По крайней мере, ни в одном компиляторе C, который я когда-либо использовал.) В ваших определениях Y, O и U вы должны иметь закрывающую двойную кавычку после каждого \n и открывающую кавычку в начале каждой следующей строки.   -  person r3mainer    schedule 08.07.2020


Ответы (1)


Основная проблема заключается в новой строке, встроенной в строки, которые вы печатаете.

Первая строка букв будет напечатана в правильном положении, но затем новая строка сбросит позицию до первого столбца следующей строки.

Я рекомендую печатать каждую букву построчно (без переноса строк). Это может помочь, если каждая буква будет массивом массивов символов, где каждый подмассив представляет собой одну строку буквы:

#define LETTER_WIDTH   11
#define LETTER_HEIGHT   6

const char Y[LETTER_HEIGHT][LETTER_WIDTH] = {
    "___      __",
    "\\ \\__ / /",
    " \\ \\ / / ",
    " |  |  |   ",
    " |  |  |   ",
    " |__|__|   "
};
person Some programmer dude    schedule 08.07.2020