"Напишите программу, которая удаляет все комментарии из программы на С++. Это значит,надо читать символы из cin и удалять комментарии двух видов: // и /* */. Получившийся текст запишите в cout. Не заботьтесь о красивом виде получившегося текста(это уже другая,более сложная задача). Корректность программ неважна. Нужно учитывать возможность появления символов // /* и */ в комментариях,строках и символьных константах."
- Задачка из книжки Бьерна Страуструпа.
Вопросы:
if (ch[i] = '/' && ch[i+1] = '/'), но такой вариант будет стирать бэкслэши и из строк("") в том числе. Как исправить этот косяк?Ну, вам же пишут - "надо читать символы из cin" - так почему бы не использовать функцию посимвольного чтения get()? По-моему, намек более чем очевиден.
Самая простая логика - детерминированный конечный автомат :) Вводим переменную состояния, принимающую значения (хоть перечисление :)) - обычный текст, предкомментарий, комментарий (2 шт.), строка, символьная константа. Можно еще некоторые промежуточные состояния - будет легче работать. Дальше - при прочтении одного символа (надо еще хранить предыдущий) работаем примерно так (набросок, надо поточнее) -
Мы в основном состоянии. Это кавычка? Предыдущий - \? просто выводим их. Нет? Переходим в состояние строки, выводим, идем дальше. Это начало комментария? Переходим в состояние предкомментария, символ запоминаем. Это просто обычный символ? запомнить, вывести.
Мы в состоянии предкомментария. Это слеш или звездочка? Если да - игнорируем символ, переходим в состояние комментария. Если нет - переходим в основное состояние, идем в обработку символа в основном состоянии, сохраненный выводим...
Мы в состоянии строки. Это кавычка? Да - переходим в основное состояние. Символ выводим в любом случае...
Мы в состоянии комментария //. Это символ новой строки? переходим в основное состояние, символ выводим. Нет - символ игнорируем.
Ну, и так далее - все возможные состояния и символы. Распишите картинку с переходами - вам сразу все станет понятнее... Да, она не самая простая, но и не такая уж и сложная.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости