Замена каждой строки, состоящей из одного или нескольких пробелов, одним пробелом - C (СИ)

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

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

Упражнение 1.9.

Напишите программу для копирования входного потока в выходной с заменой каждой строки, состоящей из одного или нескольких пробелов, одним пробелом.
Здесь я бы хотел обратить внимание на важный момент. Я просматривал различные решения. Все они сводились к тому, чтобы заменить несколько идущих друг за другом пробелов одним. Я понял эту задачу иначе. Необходимо заменить строку, состоящую только из пробелов, одним пробелом. Моя программа не работает. Подскажите, что стоит исправить (хотелось бы придерживаться такого алгоритма, что я представлю ниже).
#include <stdio.h>
 
#define IN 1 /* внутри слова */
#define OUT 0 /* снаружи слова */
 
main(){
 
    /* замена строки, состоящей из пробелов, одним пробелом */
 
    int character; /* входной символ */
 
    int spaceCounter = 0; /* счётчик пробелов */
    int charCounter = 0; /* счётчик символов внутри строки */
 
    int state = OUT; /* положение внутри (IN) или снаружи (OUT) строки */
 
    while((character = getchar()) != EOF){
 
        if(character == '\n')
            state = OUT;
        else if (state == OUT)
            state = IN;
 
        if(state == IN){
 
            putchar(character); /* вывод символа на экран */
 
            charCounter++;  /* подсчёт символов внутри строки */
 
            if(character == ' ')
                spaceCounter++; /* подсчёт пробелов */
 
        }
        else {
 
            if((spaceCounter == charCounter) && spaceCounter > 0){ /* строка состоит только из пробелов */
                
                putchar('\r'); /* возврат каретки в начало строки */
                putchar(' ');
 
            }
 
            putchar(character);
 
        } 
 
    }
}
От конструкции state == IN, state == OUT можно избавиться, но с ней, мне кажется, удобнее.

Решение задачи: «Замена каждой строки, состоящей из одного или нескольких пробелов, одним пробелом»

textual
Листинг программы
#include <stdio.h>
 
int main()
{
    int c;
    int spaces_num;
    int fail;
 
    spaces_num = 0;
    fail       = 0;
 
    while ((c = getchar()) != EOF)
    {
        if (c != '\n')
        {
            if (c == '_')
            {
                if (fail == 1)
                {
                    putchar('_');
                } else
                {
                    spaces_num = spaces_num + 1;
                }
            } else
            if (c != '_')
            {
                fail = 1;
                if (spaces_num > 0)
                {
                    while (spaces_num > 0)
                    {
                        putchar('_');
                        spaces_num = spaces_num - 1;
                    }
                }
                putchar(c);
            }
        } else
        {
            if (spaces_num > 0)
                putchar('_');
            spaces_num = 0;
            fail       = 0;
        }
    }
}

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

  1. В начале кода объявлены три переменные: c, spaces_num, fail. Значение первой переменной будет определяться вводимым символом, значение двух других - 0.
  2. Переменная spaces_num инициализируется значением 0, а fail - 0.
  3. Используется цикл while для чтения каждого символа из стандартного ввода до достижения EOF.
  4. Если текущий символ не является символом новой строки (\n), выполняется следующий блок кода.
  5. Если текущий символ является символом подчеркивания (_), выполняется следующий блок кода.
  6. Если текущий символ не является символом подчеркивания, но предыдущий символ был символом подчеркивания, выполняется следующий блок кода.
  7. Если текущий символ не является символом подчеркивания и предыдущий символ не был символом подчеркивания, выполняется следующий блок кода.
  8. Если текущий символ является символом новой строки, выполняется следующий блок кода.
  9. Если значение переменной spaces_num больше 0, выводится символ подчеркивания до тех пор, пока значение переменной spaces_num не станет равным 0.
  10. Выводится текущий символ.
  11. Если значение переменной spaces_num больше 0, выводится символ подчеркивания.
  12. Значение переменной spaces_num устанавливается равным 0.
  13. Значение переменной fail устанавливается равным 0.
  14. Цикл while продолжается до тех пор, пока не будет достигнут EOF.

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


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

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

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