Можно ли преобразовать программу, убирающую пробелы, используя только 1 функцию - C (СИ)

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

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

Можно ли преобразовать программу, убирающую пробелы, используя только 1 функцию getline (чтобы избежать дублежа)?
#include <stdio.h>
 
  #define MAXLINE 1000 /* максимальный размер вводимой строки + 1 */
 
  int getl(char line[], int maxline);
  int filter(char to[], char from[]);
 
  int main()
  {
      int len; /* длина текущей строки */
      char line[MAXLINE]; /* текущая строка */
      char newline[MAXLINE]; /* новая строка */
 
      len = 0;
      while ((len = getl(line, MAXLINE)) > 0) {
          if ((len = filter(newline, line)) != 1)
          printf("| %s", newline);
      }
      return 0;
  }
 
  /* getline: читает строку в s, возвращает длину */
  int getl(char s[], int lim)
  {
      int c, i;
 
      for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
          s[i] = c;
      if (c == '\n') {
          s[i] = c;
          ++i;
      }
      s[i] = '\0';
      return i;
  }
 
  /* filter: преобразует содержимое 'from' в 'to'
   *         убирает повторные пробелы и табуляции */
  int filter(char to[], char from[])
  {
      int c, i, j, sflag;
 
      i = 0;
      j = 0;
      sflag = 0;
      while ((c = from[i]) != '\n') {
          if (c == ' ' || c == '\t'){
              if (sflag == 0) {
                  to[j] = ' ';
                  sflag = 1;
                  ++j;
              }
          }
          else {
              to[j] = c;
              sflag = 0;
              ++j;
          }
          ++i;
      }
 
      if (c == '\n') {
          to[j] = c;
          ++j;
      }
      to[j] = '\0';
      return j;
  }
И мне еще не совсем понятно в этой программе функция filter (что такое i и j?)

Решение задачи: «Можно ли преобразовать программу, убирающую пробелы, используя только 1 функцию»

textual
Листинг программы
#include <stdbool.h>
#include <stdio.h>
 
void delete_char(char* str, int idx)
{
    while( str[idx] ) {
        str[idx] = str[++idx];
    }
}
 
void remove_spaces(char* str)
{
    char previous_char = str[0];
    int i = 1;
    while( previous_char ) {
        if( previous_char == ' ' && str[i] == ' ' ) {
            delete_char(str, i);
        } else {
            previous_char = str[i++];
        }
    }
}
 
void chomp(char* str)
{
    while( *str ) {
        if( *str == '\n' ) {
            *str = '\0';
            break;
        }
        ++str;
    }
}
 
int main()
{
    char buf[1000];
 
    while( true ) {
        fflush(stdin);
        fgets(buf, sizeof(buf), stdin);
        if( buf[0] == '\n' ) break;
        chomp(buf);
        remove_spaces(buf);
        printf("%s\n", buf);
    }
 
    return 0;
}

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


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

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

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