Удаление комментариев в программном коде Си - C (СИ)
Формулировка задачи:
Удаление комментариев
В языке Си комментарии к исходному коду начинаются с двух символов /* и заканчиваются двумя символами */. Почти все компиляторы также поддерживают однострочные комментарии в стиле Си++, которые начинаются с двух символов // и продолжаются до конца строки. Напишите программу, которая из заданной строки удаляет все правильно оформленные комментарии, учитывая оба вида. Не забудьте корректно обработать вложенные случаи, хоть многие компиляторы их и не поддерживают.
_________________________________________________________________________
На входе
Одна строка, состоящая из латинских букв, цифр, знаков препинания и других печатных символов таблицы ASCII. Размер строки не более 100 печатных символов._________________________________________________________________________
На выходе
Строка, в которой удалены все правильно оформленные вложенные комментарии. Если строка содержит ошибку, т.е. отсутствует парный конец или начало комментария, то вывести слово “ERROR”._________________________________________________________________________
Пример#1
На входе
first /*hide me/*middle*/oops*/lastНа выходе
first lastПример#2
На входе
/*/*/На выходе
ERRORПример#3
На входе
first /*hide me/*middle*/oops*/lastНа выходе
ERRORРешение задачи: «Удаление комментариев в программном коде Си»
textual
Листинг программы
#include <fstream> #include <iostream> #include <string> using namespace std; int main() { ifstream in("input.txt"); ofstream out("out.txt"); string str, type1 = "//", type2 = "/*", type3 = "*/"; size_t prostoy, slojn_otk, slojn_zak; if (!in.is_open()) { cout << "FILE HAD NOT BEEN READ!\n"; return -1; } else { int flag = 0; while (in.eof() != 1) { getline (in, str); while ((str.find(type1) != string::npos) || (str.find(type2) != string::npos) || (flag == 1)) { prostoy = str.find(type1); slojn_otk = str.find(type2); slojn_zak = str.find(type3); if (flag == 0) { if (slojn_otk < prostoy) { if ((slojn_zak != string::npos)) { str.erase (slojn_otk, slojn_zak + 2 ); } else { str.erase (str.begin() + slojn_otk, str.end()); flag = 1; break; } } else { str.erase (prostoy); break; } } else { if (slojn_zak != string::npos) { str.erase (0, slojn_zak + 2); flag = 0; } else { str.erase (0); break; } } } if (str.empty() != 1) out << str << endl; } } in.close(); out.close(); system ("out.txt"); return 0; }
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки для работы с файлами и вводом-выводом.
- Затем определяются переменные:
- in и out - объекты типа ifstream и ofstream соответственно для чтения из и записи в файлы.
- str - строковая переменная для хранения прочитанной строки из файла.
- type1, type2, type3 - строковые константы, которые соответствуют символам комментариев в коде.
- prostoy, slojn_otk, slojn_zak - переменные типа size_t для хранения позиций символов комментариев в строке.
- flag - флаг, который используется для контроля внешнего цикла.
- После проверки открытия файла in и отсутствия ошибок, в цикле while с условием eof() читаются строки из файла до тех пор, пока не будет достигнут конец файла.
- Внутри цикла while находится внутренний цикл while, который выполняется до тех пор, пока не будут найдены все символы комментариев в строке.
- Внутри внутреннего цикла while находятся еще три вложенных цикла while. Они используются для поиска трех типов комментариев в строке.
- Если найден хотя бы один из трех типов комментариев, то выполняется блок кода, который удаляет этот комментарий из строки.
- Если после удаления комментариев строка оказывается пустой, то она записывается в файл out и цикл прерывается.
- После завершения цикла while выполняется блок кода, который закрывает файлы in и out, а затем выполняет команду system(
out.txt
), которая открывает файл out.txt для выполнения системных операций с ним. - В конце функции main() возвращается 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д