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".