K&R, программа для копирования входного потока в выходной с удалением лишних пробелов (нужны комментарии) - C (СИ)
Формулировка задачи:
Привет, всем. Начал учить Си по Кернигану и Ритчи. Упражнение 1.9 - напишите программу для копирования входного потока в выходной с заменой каждой строки, состоящей из одного или нескольких пробелов, одним пробелом.
Не мог сообразить, нашёл решение здесь же на форуме, всё работает
Теперь вопрос - не могу понять как работает первый блок if, каким образом он сокращает несколько пробелов до одного?
#include <stdio.h>
int main()
{
int c;
c = getchar();
while (c != '.')
{
if (c == ' ')
{
while (c == ' ')
c = getchar();
printf(" ");
putchar(c);
c = getchar();
}
if (c != ' ')
{
putchar(c);
c = getchar();
}
}
}Решение задачи: «K&R, программа для копирования входного потока в выходной с удалением лишних пробелов (нужны комментарии)»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
/*программа печатающая ввод на вывод и вместо нескольких пробелов подряд оставляющая
только один пробел*/
int main()
{
int c,ns = 0;
while ((c = getchar()) != EOF){
if (c != ' ') ns = 0;
if (c == ' ') ++ ns;
if (ns <= 1) putchar(c);
}
return 0;
}
Объяснение кода листинга программы
- Программа начинается с подключения необходимых библиотек для работы с файлами и стандартным вводом/выводом.
- Затем определены две переменные:
cиns. Первая используется для хранения текущего символа, вторая - для подсчета количества пробелов. - Далее следует цикл
while, который продолжается до тех пор, пока не будет достигнут конец файла (т.е.EOF). - Внутри цикла происходит проверка на равенство текущего символа пробелу. Если это так, то переменная
nsсбрасывается в 0. - Если текущий символ - не пробел, то увеличивается значение переменной
ns, которая отслеживает количество пробелов. - Если текущий символ - пробел и переменная
nsбольше 1, то программа пропускает этот пробел. - Если текущий символ - пробел и переменная
nsравна 1, то этот пробел выводится на экран. - Если текущий символ - не пробел, то он выводится на экран.
- По завершении цикла программа возвращает 0, что означает успешное выполнение.