C++: удаление комментариев из строки?

Я делаю задание, которое считывает данные из текстового файла, и я должен поместить данные в вектор, отфильтровывая числа, которые начинаются с 0 и комментариев. У меня все вниз, кроме фильтрации комментариев. То, что у меня есть в теории, должно работать, но у меня просто возникают проблемы с его выполнением. Это код проблемы:

vector<string> nums_after;
for(int i = 0; i < nums_before.size(); i++)
{
    string current = nums_before[i];
    if (current.front() == '(')
    {
        current.erase(current.find("(*"), current.find("*)"));
    }
    if (current.front() == '0')
    {
        continue;
    }
    nums_after.push_back(current);
}

Мой пример файла выглядит так:

101481
10974
1013
(* comment *)0
28292
35040
35372
0000
7155
7284
96110
26175

Но мой код только отфильтровывает (* и даже не пробел после звездочки. Я думаю, что у меня просто проблемы с объединением функций erase() и find(). У кого-нибудь есть какие-либо предложения?

РЕДАКТИРОВАТЬ: понял, что моя проблема была в том, что строка комментария была разбита на три отдельные строки: (*, комментарий и *)0. Сейчас я подозреваю проблему с моей функцией getline. Вот как это выглядит:

int main() {
string line;
string fileName;
cout << "Enter the name of the file to be read: ";
cin >> fileName;

ifstream inFile{fileName};

istream_iterator<string> infile_begin {inFile};
istream_iterator<string> eof{};
vector<string> nums_before {infile_begin, eof};
while (getline(inFile, line))
{
    nums_before.push_back(line);
}

Это происходит прямо перед первым блоком кода.

3 ответа

В таких ситуациях вы должны выбрать stack структура данных или обратная итерация.

void func ( int &error, int inc, int &i ) {
    error += inc;
    i -= 2;
}

string output;
for ( int i=nums_before.size()-1; i>=0; ++i ) {
    if ( nums_before[i] == ')' && nums_before[i-1] == '*' ) {
        static int error;
        func ( error, 1, i );

        while ( error != 0 ) {
            if ( nums_before[i] == ')' && nums_before[i-1] == '*' ) 
                func ( error, 1, i );
            else if ( nums_before[i] == '*' && nums_before[i-1] == '(' ) 
                func ( error, -1, i );
            else --i;
        }
    } else output += nums_before[i];
}

cout << output.reverse() << endl;

вход: 101481 10974 1013 (* comment *)0 28292 35040 35372 0000 7155 7284 96110 26175

выход: 101481 10974 1013 0 28292 35040 35372 0000 7155 7284 96110 26175

Простое решение, но вложенные комментарии не поддерживаются:

std::string removeComments(std::string str)
{
    std::string::size_type begin, end;
    while((begin = str.find("(*")) != std::string::npos)
    {
        if(((end = str.find("*)")) != std::string::npos) && (end > begin))
            str.erase(begin, end - begin + 2);
        else
            break;
    }
    return str;
}

Тестовое задание:

std::string test = "1745 2355 (* comment *) 0 1454 4352 4234 (* comment *)";
std::cout << removeComments(test) << std::endl;

Выход:

1745 2355  0 1454 4352 4234

Пример без использования функций:

std::vector<std::string> strings;
for(int i=0; i<strings.size(); ++i)
{
    std::string::size_type begin, end;
    while((begin = strings[i].find("(*")) != std::string::npos)
    {
        if(((end = strings[i].find("*)")) != std::string::npos) && (end > begin))
            strings[i].erase(begin, end - begin + 2);
        else
            break;
    }
}

Что находится в nums_before? я предполагаю, что полный текст разделен пробелами? в этом случае имеет смысл, что он удаляет только (*, потому что это то, что находится в текущей строке, которую вы просматриваете, это "(*". следующая строка - "комментарий", а следующая - "*)0".

Другие вопросы по тегам