Выравнивание текста по Си с отступом - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть простая функция для печати текста.

while (recvbuf[i] != '\0') {
    if (i == 0) {
        printf("%+40c", recvbuf[i]);
    }
    else {
        printf("%c", recvbuf[i]);
    }
    i++;
};

Он печатает текст, и первое слово (строка) начинается с отступа 40. Но я хочу начать с каждой строки с отступа 40 не только первым. Не знаю как это сделать.

Спасибо за любую помощь.

Что мне нужно в качестве вывода в CONSOLE.

             fksdpo gfdg fd gdf gdf gdf gfd gdf gd
             fksdpo gfdg fd gdf gdf gdf gfd gdf gd
             fksdpo gfdg fd gdf gdf gdf gfd gdf gd
             fksdpo gfdg fd gdf gdf gdf gfd gdf gd
             fksdpo gfdg fd gdf gdf gdf gfd gdf gd
             fksdpo gfdg fd gdf gdf gdf gfd gdf gd
             fksdpo gfdg fd gdf gdf gdf gfd gdf gd

Что у меня сейчас.

             fksdpo gfdg fd gdf gdf gdf gfd gdf gd
fksdpo gfdg fd gdf gdf gdf gfd gdf gd
fksdpo gfdg fd gdf gdf gdf gfd gdf gd
fksdpo gfdg fd gdf gdf gdf gfd gdf gd
fksdpo gfdg fd gdf gdf gdf gfd gdf gd
fksdpo gfdg fd gdf gdf gdf gfd gdf gd

1 Ответ

1 голос
/ 15 апреля 2019

Я не уверен, что это заполнение, которое вы хотите (для меня, дополнение идет после, так что я не буду использовать этот термин).Вы хотите добавить некоторое форматирование пробела в начале строки консоли.

Таким образом, вы должны определить: ширину консоли, начальные пробелы, которые вы хотите.

Затем для каждого слова для печати вы должнырассчитать, будет ли достигнута ширина консоли.Если это так, вы должны начать новую строку.

Если нужна новая строка, вы должны начать ее с пробелов.

#include <ctype.h>
#include <stdio.h>

int word_length(const char *word)
{
    int size = 0;
    for (; *word && !isspace(*word); ++word)   
{     
        ++size;
    }
    return size;
}

void print_word(const char *word, int size)
{
    while(size--)
        putchar(*word++);

    putchar(' ');

}

void format(int width, int spaces, const char *text)
{
    int sol = spaces;
    int current_pos = 0;

    while (*text)
    {   
        /* size of the current word */
        int word_len;

    /* if needed, print spaces */
        for (; sol != 0; --sol)
        {
            putchar(' ');
            ++current_pos;
        }

        /* get size of next word */
        word_len = word_length(text);

        if (word_len > width)
        {
            printf("error, word too long...\n");
            return;
        }


    /* see if writting current word will go over width*/
        if (current_pos + word_len > width)
        {
            sol = spaces;
            current_pos = 0;
            putchar('\n');
            continue;
        }

        /* print the current word */
        print_word(text, word_len);

        /* update the cursor position */
        current_pos += word_len + 1;

        /* position text pointer position on next word */
        text += word_len;            
        while(*text && isspace(*text))
        {
            ++text;
        }                        
    }
}

int main(void)
{
    char text[] = "fksdpo gfdg fd gdf gdf gdf gfd gdf gd fksdpo gfdg fd gdf gdf gdf gfd gdf gd fksdpo gfdg fd gdf gdf gdf gfd gdf gd fksdpo gfdg fd gdf gdf gdf gfd gdf gd fksdpo gfdg fd gdf gdf gdf gfd gdf gd fksdpo gfdg fd gdf gdf gdf gfd gdf gd";
    format(45, 5, text);
    return 0;
}

Даст:

     fksdpo gfdg fd gdf gdf gdf gfd gdf gd 
     fksdpo gfdg fd gdf gdf gdf gfd gdf gd 
     fksdpo gfdg fd gdf gdf gdf gfd gdf gd 
     fksdpo gfdg fd gdf gdf gdf gfd gdf gd 
     fksdpo gfdg fd gdf gdf gdf gfd gdf gd 
     fksdpo gfdg fd gdf gdf gdf gfd gdf gd 
...