Удаление комментариев в программном коде Си - 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;
}

Объяснение кода листинга программы

  1. В начале кода подключаются необходимые библиотеки для работы с файлами и вводом-выводом.
  2. Затем определяются переменные:
    • in и out - объекты типа ifstream и ofstream соответственно для чтения из и записи в файлы.
    • str - строковая переменная для хранения прочитанной строки из файла.
    • type1, type2, type3 - строковые константы, которые соответствуют символам комментариев в коде.
    • prostoy, slojn_otk, slojn_zak - переменные типа size_t для хранения позиций символов комментариев в строке.
    • flag - флаг, который используется для контроля внешнего цикла.
  3. После проверки открытия файла in и отсутствия ошибок, в цикле while с условием eof() читаются строки из файла до тех пор, пока не будет достигнут конец файла.
  4. Внутри цикла while находится внутренний цикл while, который выполняется до тех пор, пока не будут найдены все символы комментариев в строке.
  5. Внутри внутреннего цикла while находятся еще три вложенных цикла while. Они используются для поиска трех типов комментариев в строке.
  6. Если найден хотя бы один из трех типов комментариев, то выполняется блок кода, который удаляет этот комментарий из строки.
  7. Если после удаления комментариев строка оказывается пустой, то она записывается в файл out и цикл прерывается.
  8. После завершения цикла while выполняется блок кода, который закрывает файлы in и out, а затем выполняет команду system(out.txt), которая открывает файл out.txt для выполнения системных операций с ним.
  9. В конце функции main() возвращается 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5