Хорошо, прежде чем я даже задал свой вопрос, я хочу сделать одно ясно. В настоящее время я студент NIU по информатике, и это относится к одному из моих заданий для класса. Поэтому, если у кого-то есть проблема, не читайте дальше и просто продолжайте рассказывать о своем бизнесе.Очистка строки пунктуации в C++
Теперь для тех, кто готов помочь в этой ситуации. Для моего текущего задания мы должны прочитать файл, который является всего лишь блоком текста. Для каждого слова в файле мы должны очистить любые знаки препинания в слове (например: «не может» в конечном итоге «может» и «тот - к» будет «явно» без кавычек, цитаты использовались только для указания того, что было в примере).
Проблема, с которой я столкнулся, заключается в том, что я могу очистить строку, а затем вставить ее в карту, которую мы используем, но по какой-то причине с написанным мной кодом она позволяет вставить пустую строку в карта. Теперь я пробовал все, что мог придумать, чтобы это не произошло, и единственное, что я придумал, это использовать метод стирания в самой структуре карты.
Так что я ищу две вещи, любые предложения о том, как я мог это сделать) исправить это, просто просто стирая его, и б) любые улучшения, которые я мог бы внести в код, который я уже написал.
Вот функции, которые я написал для чтения из файла, а затем тот, который его очищает.
Примечание: функция, которая считывает данные из файла, вызывает функцию clean_entry, чтобы избавиться от пунктуации, прежде чем что-либо будет вставлено на карту.
Редактировать: Спасибо Крис. Номера разрешены :). Если у кого-то есть улучшения в коде, который я написал, или какой-либо критике чего-то, что я сделал, я буду слушать. В школе мы действительно не возвращаемся к правильному, правильному или эффективному способу делать что-то.
int get_words(map<string, int>& mapz)
{
int cnt = 0; //set out counter to zero
map<string, int>::const_iterator mapzIter;
ifstream input; //declare instream
input.open("prog2.d"); //open instream
assert(input); //assure it is open
string s; //temp strings to read into
string not_s;
input >> s;
while(!input.eof()) //read in until EOF
{
not_s = "";
clean_entry(s, not_s);
if((int)not_s.length() == 0)
{
input >> s;
clean_entry(s, not_s);
}
mapz[not_s]++; //increment occurence
input >>s;
}
input.close(); //close instream
for(mapzIter = mapz.begin(); mapzIter != mapz.end(); mapzIter++)
cnt = cnt + mapzIter->second;
return cnt; //return number of words in instream
}
void clean_entry(const string& non_clean, string& clean)
{
int i, j, begin, end;
for(i = 0; isalnum(non_clean[i]) == 0 && non_clean[i] != '\0'; i++);
begin = i;
if(begin ==(int)non_clean.length())
return;
for(j = begin; isalnum(non_clean[j]) != 0 && non_clean[j] != '\0'; j++);
end = j;
clean = non_clean.substr(begin, (end-begin));
for(i = 0; i < (int)clean.size(); i++)
clean[i] = tolower(clean[i]);
}
Оплачено для полного раскрытия – 2008-09-22 18:10:45
То же самое здесь. Я также признателен, что Брэндон, очевидно, приложил много усилий к его работе, прежде чем задавать вопрос. – 2008-09-22 18:15:28
У меня нет проблем с кем-то, просящим о помощи по домашнему заданию, когда они сначала попытались выполнить его. Это ленивые люди, которые просят нас сделать всю свою работу за них, которые раздражают меня. – 2008-09-22 18:22:00