Программа удаляющая комментарии C++ [закрыт]

135
03 октября 2019, 01:00

"Напишите программу, которая удаляет все комментарии из программы на С++. Это значит,надо читать символы из cin и удалять комментарии двух видов: // и /* */. Получившийся текст запишите в cout. Не заботьтесь о красивом виде получившегося текста(это уже другая,более сложная задача). Корректность программ неважна. Нужно учитывать возможность появления символов // /* и */ в комментариях,строках и символьных константах."

- Задачка из книжки Бьерна Страуструпа.

Вопросы:

  1. Как читать символы из cin, если этот оператор после пробела не принимает дальше текст?
  2. Как бы вы реализовали логику? Сразу на ум приходит if (ch[i] = '/' && ch[i+1] = '/'), но такой вариант будет стирать бэкслэши и из строк("") в том числе. Как исправить этот косяк?
Answer 1
  1. Ну, вам же пишут - "надо читать символы из cin" - так почему бы не использовать функцию посимвольного чтения get()? По-моему, намек более чем очевиден.

  2. Самая простая логика - детерминированный конечный автомат :) Вводим переменную состояния, принимающую значения (хоть перечисление :)) - обычный текст, предкомментарий, комментарий (2 шт.), строка, символьная константа. Можно еще некоторые промежуточные состояния - будет легче работать. Дальше - при прочтении одного символа (надо еще хранить предыдущий) работаем примерно так (набросок, надо поточнее) -

Мы в основном состоянии. Это кавычка? Предыдущий - \? просто выводим их. Нет? Переходим в состояние строки, выводим, идем дальше. Это начало комментария? Переходим в состояние предкомментария, символ запоминаем. Это просто обычный символ? запомнить, вывести.

Мы в состоянии предкомментария. Это слеш или звездочка? Если да - игнорируем символ, переходим в состояние комментария. Если нет - переходим в основное состояние, идем в обработку символа в основном состоянии, сохраненный выводим...

Мы в состоянии строки. Это кавычка? Да - переходим в основное состояние. Символ выводим в любом случае...

Мы в состоянии комментария //. Это символ новой строки? переходим в основное состояние, символ выводим. Нет - символ игнорируем.

Ну, и так далее - все возможные состояния и символы. Распишите картинку с переходами - вам сразу все станет понятнее... Да, она не самая простая, но и не такая уж и сложная.

READ ALSO
Как заблокировать создание файла?

Как заблокировать создание файла?

Нужно написать драйвер блокировать создание файла, пробую через Minifilter, но ничегоПолучается видеть только мониторинг процессов (создание,...

130
Ошибка E0513 значение типа “const wchar_t *” нельзя присвоить сущности типа “wchar_t *”

Ошибка E0513 значение типа “const wchar_t *” нельзя присвоить сущности типа “wchar_t *”

Всем добрый деньПосмотрел много вариантов решения проблемы но что то ничего не помогает

569
c++: задать точность числа при выводе через printf

c++: задать точность числа при выводе через printf

Подскажите, как задать точность вывода float/double числа через printf?

148