C программа для форматирования текста - PullRequest
0 голосов
/ 05 ноября 2018

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

Example input: "John     had  a lot          of work to do."
Result:"John had
        a lot of
        work  to
              do"

В примере, очевидно, я использовал не правило 80 символов, а 8. Мой код далеко, устраняет лишние пробелы и может вычислить длину строки.

#include <stdio.h>

int main()
{
   char text[1000], blank[1000],rez[1000];
   int n,i;
   printf("give string\n");
   gets(text);
   blankremove(text,blank);
   printf("%s\n",blank);
   n=lenght(blank);
   printf("%d", n);

   return 0;
}

int lenght(char a[]){
int lenght;
lenght=0;
while (a[lenght]!='\0')
{
    lenght++;
}
return lenght;
}

int blankremove(char text[], char blank[])
{

   int c = 0, d = 0;
   while (text[c] != '\0') {
      if (text[c] == ' ') {
         int temp = c + 1;
         if (text[temp] != '\0') {
            while (text[temp] == ' ' && text[temp] != '\0') {
               if (text[temp] == ' ') {
                  c++;
               }
               temp++;
            }
         }
      }
      blank[d] = text[c];
      c++;
      d++;
   }
   blank[d] = '\0';}

1 Ответ

0 голосов
/ 05 ноября 2018

(Для меня это похоже на домашнюю работу. Имейте в виду, что учитель также имеет доступ к Stackoverflow.)

Давайте посмотрим, ваше форматирование ... прискорбно, но это не то, о чем вы просите.

Я думаю, что это будет делать то, что вам нужно.

Добавьте эти строки непосредственно перед возвратом в main:

fillLine(blank,rez,sizeof(rez));
printf("%s\n", rez);

Затем создайте функцию с именем fillLine, которая будет смотреть, что подойдет, и поместите ее в строку, если она подойдет.

/* Find the length of the next word on the line, upto the next space.
 */
int lenWord(char *in)
{
    int ii;
    for(ii=0; in[ii]!=0 && in[ii]!=' '; ii++);
    return(ii);
}
#define MAX_COLUMNS 16
/*
 * This will stuff what it can in MAX_COLUMNS columns
 */
int fillLine(char *blank, char *rez, int rezSize)
{
    int in;
    int out;
    int col;
    for(col=0, in=0, out=0; blank[in]!=0 && out<rezSize;) {
        int len=lenWord(&blank[in]);
        if(col+len+1 < MAX_COLUMNS ) {
            int ii;
            for(ii=0; ii<len; ii++) {
                rez[out]=blank[in];
                in++;
                out++;
                col++;
            }
            rez[out]=' ';
            in++;
            out++;
            col++;
        } else {
            rez[out]='\n';
            out++;
            col=0;
        }
    }
    return(out);
}

В этой версии есть несколько проблем (которые я предлагаю вам решить, прежде чем включить):

  1. Я передал размер области вывода rez функции, но не проверил ее достаточно, чтобы убедиться, что я не ухожу за пределы конца и не уничтожаю что-то еще.
  2. Я оставляю пробел в конце всех строк, что означает, что они не так заполнены, как могли бы.
  3. Функцию fillLine можно комбинировать с функцией blankRemove, чтобы сделать программу более краткой.
  4. Некоторые люди предпочитают ставить константы слева при проверке равенства в случае опечатки: 0!=in[ii], а не in[ii]!=0. Это помогает избежать потенциала для if( in[ii]=0) {. Некоторые люди приходят в восторг от условий Йоды , как за, так и против.

Это даст вам идею. Я мог бы прокомментировать, что использование таких переменных, как ii, а не i, облегчает их поиск в текстовом редакторе.

...