Замена каждой строки, состоящей из одного или нескольких пробелов, одним пробелом - 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);
}
}
}Решение задачи: «Замена каждой строки, состоящей из одного или нескольких пробелов, одним пробелом»
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;
}
}
}
Объяснение кода листинга программы
- В начале кода объявлены три переменные: c, spaces_num, fail. Значение первой переменной будет определяться вводимым символом, значение двух других - 0.
- Переменная spaces_num инициализируется значением 0, а fail - 0.
- Используется цикл while для чтения каждого символа из стандартного ввода до достижения EOF.
- Если текущий символ не является символом новой строки (\n), выполняется следующий блок кода.
- Если текущий символ является символом подчеркивания (_), выполняется следующий блок кода.
- Если текущий символ не является символом подчеркивания, но предыдущий символ был символом подчеркивания, выполняется следующий блок кода.
- Если текущий символ не является символом подчеркивания и предыдущий символ не был символом подчеркивания, выполняется следующий блок кода.
- Если текущий символ является символом новой строки, выполняется следующий блок кода.
- Если значение переменной spaces_num больше 0, выводится символ подчеркивания до тех пор, пока значение переменной spaces_num не станет равным 0.
- Выводится текущий символ.
- Если значение переменной spaces_num больше 0, выводится символ подчеркивания.
- Значение переменной spaces_num устанавливается равным 0.
- Значение переменной fail устанавливается равным 0.
- Цикл while продолжается до тех пор, пока не будет достигнут EOF.