Astellar |
29.05.2010 00:15 |
А вот нет, суть ой какая разная будет, если условия учесть. А их надо учитывать. Вот более правильный вариант, использующий регулярные выражения. И почему никто о них не вспоминает, когда текст обработать надо?
Код:
#include <regex>
#include <iostream>
// just a short name to use
typedef std::tr1::sregex_token_iterator tokenizer;
int main(int argc, char* argv[])
{
// to show russian text correctly
setlocale(LC_ALL, "rus_rus.1251");
// sample text with different types of delimiters
const std::string text = "Это наше предложение номер 1!!!!\n" \
"А это - номер два, так ведь?!\t\t " \
"Ну и, конечно же, с числами 3.1415 и 2^10... " \
"И заодно проверим прямую речь: \"Ты почто боярыню обидел, смерд?\".";
// a pattern to split nearly any text into sentences
// note that we preserve all odd spaces, etc.
const std::tr1::regex text_to_sent_p("([^.?!]|\\.\\d+|[.?!]+\")+[.?!]+");
// your input word must be wrapped into regex
// btw, we can even search for multiple words at once
const std::tr1::regex input_str_p("номер");
const tokenizer end; int word_count = 0;
for (tokenizer i(text.begin(), text.end(), text_to_sent_p); i != end; ++i)
{
std::string sentence((*i).str());
for (tokenizer j(sentence.begin(), sentence.end(), input_str_p); j != end; ++j)
++word_count;
std::cout << sentence << " " << word_count;
word_count = 0;
}
return 0;
}
Немного пояснений: во-первых, регистр букв учитывается при поиске слова, а во-вторых, ищется именно вхождение слова в предложение (т.е. в слове Пятница будет например найдено слово Пятниц).
|