Выравнивание текста добавлением пробелов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день, прошу помощи с написанием программы. Задание - "Текст, состоящий из нескольких строк, выровнять по ширине добавлением дополнительных пробелов между словами". То есть вводятся 2 строки и учитываю то,что при выводе макс.символов в строке 80,выровнять строки которые вели путем добавления пробелов. Заранее Спасибо

Решение задачи: «Выравнивание текста добавлением пробелов»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N 80
 
int JustifyText(const char* const src, char* const resultStr)
{
  int errorCode = 0;  /* error code + return value */
  
  size_t sequenceCount = 0;           /* non-space sequence counter */
  size_t totalSequenceLength = 0;     /* total length of non-space sequences */
  size_t spacesBetweenSequences = 0;  /* number of spaces required to insert */
  size_t remainder = 0;               /* remainder of spaces to insert */
  size_t i = 0;
  size_t j = 0;
 
  char* tempSrcStr = NULL;  /* temporary source string */
  char* tempResStr = NULL;  /* temporary return string */
  char* pch = NULL;         /* temporary pointer */
 
  do
  {
    if ((src == NULL) || (resultStr == NULL))
    {
      errorCode = 1;
      break;
    }
 
    if (strlen(src) >= N)
    {
      errorCode = 1;
      break;
    }
 
    /* allocating buffers */
    tempSrcStr = malloc((strlen(src) + 1) * sizeof(*src));
    if (tempSrcStr == NULL)
    {
      errorCode = 1;
      break;
    }
 
    tempResStr = malloc((N + 1) * sizeof(*tempResStr));
    if (tempResStr == NULL)
    {
      errorCode = 1;
      break;
    }
 
    strcpy(tempSrcStr, src);
    memset(tempResStr, 0, (N + 1) * sizeof(*tempResStr));
 
    /* 
      calculate number and total length of non-spaced sequences in sting, e.g.
      "words" with separators.
 
      Ex.: <string>: "This, whatever it is, must be a test string!"
      ->
      <This,>     = [5]
      <whatever>  = [8]
      <it>        = [2]
      <is,>       = [3]
      <must>      = [4]
      <be>        = [2]
      <a>         = [1]
      <test>      = [4]
      <string!>   = [7]
      -----------------
      count: 9, total length: 36
 
      This will be needed to estimate the amount of spaces to insert between
      sequences to reach
    */
    sequenceCount = 0;
    totalSequenceLength = 0;
 
    pch = strtok(tempSrcStr, " ");
    while (pch != NULL)
    {
      sequenceCount++;
      totalSequenceLength = totalSequenceLength + strlen(pch);
 
      pch = strtok(NULL, " ");
    }
 
    /* calculating how many spaces between sequences we need */
    spacesBetweenSequences = (N - totalSequenceLength) / (sequenceCount - 1);
    
    strcpy(tempSrcStr, src);
 
    /* 
      calculating remainder
      
      in case if we are unable to insert equal amounts of spaces between all
      sequences we will need to add remaining (to N) amount somewhere in the
      middle of string
    */
    remainder = N - (spacesBetweenSequences * (sequenceCount - 1) + totalSequenceLength);
 
    /* composing string */
    j = 0;
    pch = strtok(tempSrcStr, " ");    
    while (pch != NULL)
    {
      strcat(tempResStr, pch); /* copying sequence */
 
      /*
        inserting remainder
        
        NOTE:
          there is no increment of "j" because these spaces are counted as
        a part of current sequence
      */
      if (j == (sequenceCount - 1) / 2)
      {
        for(i = 0; i < remainder; i++)
        {
          tempResStr[strlen(tempResStr)] = ' ';
        }        
      }
      
      /* padding sequence with spaces */
      if (j < (sequenceCount - 1))
      {
        for(i = 0; i < spacesBetweenSequences; i++)
        {
          tempResStr[strlen(tempResStr)] = ' ';
        }
        j++;
      }
 
      pch = strtok(NULL, " ");
    }
    
    /* exporting result */
    strcpy(resultStr, tempResStr);
  }
  while (0);
 
  free(tempSrcStr);
  free(tempResStr);
 
  return errorCode;
}
 
int main(void)
{
  char* s = malloc((N + 1) * sizeof(*s));
 
  JustifyText("This, whatever it is, must be a test string!", s);
 
  printf("%s\n", s);
 
  free(s);
 
  return 0;
}

Объяснение кода листинга программы

  1. Объявлены следующие переменные:
    • errorCode (int) - переменная для хранения кода ошибки
    • sequenceCount (size_t) - счетчик количества последовательностей
    • totalSequenceLength (size_t) - общая длина всех последовательностей
    • spacesBetweenSequences (size_t) - количество пробелов между последовательностями
    • remainder (size_t) - остаток пространства, которое необходимо заполнить пробелами
    • i (size_t) - счетчик для пробелов
    • j (size_t) - счетчик для последовательностей
  2. Выделены следующие буферы:
    • tempSrcStr (char*) - временный буфер для исходной строки
    • tempResStr (char*) - временный буфер для результирующей строки
    • pch (char*) - временный указатель для разбиения исходной строки на последовательности
  3. В функции main() исходная строка This, whatever it is, must be a test string! выделяется в буфер s.
  4. Затем вызывается функция JustifyText(), которая принимает исходную строку и буфер для результирующей строки.
  5. Внутри функции JustifyText() выполняются следующие действия:
    • Проверка наличия исходной и результирующей строк
    • Проверка, что исходная строка не превышает длину N
    • Выделение буферов для исходной и результирующей строк
    • Копирование исходной строки в буфер tempSrcStr
    • Заполнение результирующей строки tempResStr последовательностями исходной строки с добавлением пробелов
    • Вывод результирующей строки
  6. В конце функции main() буфер s освобождается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.455 из 5
Похожие ответы