Персонализированная перенос текста в C - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь создать функцию, которая принимает строку и число, представляющее ширину каждой создаваемой строки.

Вот как она принимает входные данные: WrapText (строка, 20);

То, что эта функция должна делать, это помещать максимум символов «ширина» (в этом примере 20) строки в каждую строку.

Перед переносом:

Lorem ipsum dolor sit amet, посвященный адептированию elit.Curabitur vitae diam non enim vestibulum interdum.

После обертывания:

Lorem ipsum dolor

сит амет,

концерт

adipiscing elit.

Curabitur vitae diam

non enim vestibulum

intermum.


Максимум 20 символов в строке истрока должна соответствовать целым словам, а не разрезать их посередине.

Может кто-нибудь помочь мне с алгоритмом для этого?Я попробовал кое-что, но я просто не могу понять это правильно.

Что-то, что я попробовал:

int x=0,line=0,total=0;
while(arr[x]!='\0'){
    if(arr[x]!=' '){
        line++;
    }else{
        if(total+line>=width){
            arr[x]='\n';
        }else{
            line++;
            total+=line;
        }
        line=0;
    }
    x++;
}

1 Ответ

0 голосов
/ 11 декабря 2018

Вам нужно сканировать заранее, читая каждое слово и вычисляя его длину, прежде чем вывести что-либо.Вы можете сделать это, скопировав слово во временный буфер, или вы можете использовать указатели, чтобы сделать это при сканировании.

Использовать буфер просто, но вы не знаете, каков размер буфера для выделенияэто имеет внутренние ограничения.

Версия указателя может быть сделана как простой конечный автомат с двумя состояниями, BETWEEN_WORDS и IN_WORD.Все интересное происходит только при переходах между состояниями;сканирование слов или пробелов просто для чтения.

Псевдокод:

initial state = BETWEEN_WORDS
start_of_word_ptr = null

for each character,
    if whitespace, then
        if the current state is IN_WORD, then
            the new state is BETWEEN_WORDS
            word_length = current_pos - start_of_word_pos
            if current_line_length + word_length + 1 > max_line_length, then
                /* start a new line */
                print linefeed
                current_line_length = 0
            else
                /* output space */
                print a space between words
                current_line_length++
    else if not whitespace, then
        if the current state is BETWEEN_WORDS, then
            the new state is IN_WORD
            start_of_word_ptr = current_ptr

        /* output word */
        print the characters from start_of_word_pos to current_pos
        current_line_length += word_length

Это базовый алгоритм, который будет делать то, что вы хотите для ввода строки.Настроить по вкусу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...