A1exSun
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите доделать функцию для вывода текста. Она должна делать отступы слева и справа от краев экрана, и еще переносить слова, которые не помещаются. Мой код: Код: void echo(char *str, int l, int r) { int i, j = 0, k, w, len, d; char *out; // тут будет строка для вывода w = 80 - (l + r); // длина выводимой строки len = strlen(str); // длина текста для вывода out = calloc(w+1,sizeof(char)); if (wherex() > l+1) gotoxy(l+1,wherey()+1); else gotoxy(l+1,wherey()); for (i = 0; i < len; i++) { // обрабатываем символы switch (str[i]) { case '\t': for (k = 0; k < 4; k++) out[j++] = ' '; break; // tab = 4 пробела case '\n': d = w; break; // расстояние до пробела = длина строки и срабатывает условие для переноса default: out[j++] = str[i]; } d = 0; while (str[i+d+1] != ' ' && str[i+d+1] != '\0') d++; // находим расстояние до пробела if (d >= w) { // если расстояние больше длины строки для вывода strncpy(out,str,w); // копируем кусок текста out[w] = 0; j = w; // счетчик символов строки для вывода = длина строки и срабатывает условие для переноса i += w - 1; // увеличиваем счетчик цикла } if (d > w - j || str[i+1] == '\0' || str[i+1] == '\n' ) { // условие для переноса cprintf("%s",out); // выводим строку для вывода j = 0; // обнуляем счетчик символов строки для вывода if (str[i+1] != '\0') gotoxy(l+1,wherey()+1); // если текст еще не закончился - переводим курсор memset(out,0,w+1); // очищаем строку для вывода } } free(out); } | Работает отлично, но если вывести: Цитата: qwerty\nqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwerty | , то выведется: Цитата: qwerty\n_______qwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwerty | Где _ - обычный пробел. Это потому что в случае если "слово" не помещается на наш "экран", я копирую кусок текста длиной в ширину нашего экрана и вывожу его сразу без обработки \n. Объясните как переделать алгоритм, чтоб такого случалось. |