Дело в том, что gets читает в указанный буфер
всю строку до перевода каретки. То есть, если пользователь введёт несколько слов через пробел, то в S пападут все эти слова. Очевидно, что в таком случае проверка strlen(S) не будет работать, так как эта функция вернёт длину не слова, а всей строки, содержащей несколько слов.
Для достижения цели, следует несколько усложнить алгоритм. Наша задача перебрать все слова в введённой строке.
Специальные переменные:
ТекущийИндекс,
ДлинаСлова : целое
1. Читаем строку.
2. ДлинаСлова присвоить 0.
3. Запускаем цикл по переменной
ТекущийИндекс по всем символам прочитанной строки, включая терминирующий ноль:
3.1. Если текущий символ (символ с индексом
ТекущийИндекс) равен пробелу или терминирующему нолю, то:
3.1.1. Если
ДлинаСлова больше ноля, то:
3.1.1.1. Если
ДлинаСлова равна 5, то напечатать "компьютер",
3.1.1.2. Иначе если
ДлинаСлова не равна 4, то напечатать символы слова, начиная с индекса (
ТекущийИндекс -
ДлинаСлова) и оканчавая индексом
ТекущийИндекс - 1, затем ещё напечатать пробел.
3.1.1.3. ДлинаСлова присвоить 0.
3.2. Иначе (относится к уcловию в пункте
3.1.).
3.2.1. Увеличить
ДлинаСлова на один.
4. Конец программы.
Заметка относительно пункта
3.1.1.2. Печатать символы слова можно циклом по отдельности.
Наверное, потребуются дополнительные сведения по С-шным строкам с терминирующим нолём. Я уже делал краткий ликбез по этой теме. Дабы не повторяться, советую почитать вот
тут (третье сообщение).