Witajcie
Napisałem w C++ funkcję, której zadanie jest znalezienie hashtagów z podanego tekstu. Ta funkcja będzie elementem mojego pewnego większego programu. Hashtagi są wyłapywane według następujących kryteriów:
Jako hasztag uznany jest fragment tekstu, który:
-Poprzedza znak #, który jeszcze jest poprzedzony znakiem, który nie jest alfanumeryczny.
-Składa się przynajmniej z jednego wymaganego znaku(alfanumerycznego).
-Składa się tylko z znaków alfanumerycznych. Inny znak już nie jest uznany za część hasztagu, tylko za koleją część tekstu.
Potem może to przerobię, aby zwracało listę jednokierunkową. I jak coś, to świadomie dla wygody załączyłem całą przestrzeń nazw std. Powiedzcie co o sądzicie o tej funkcji, czy dałoby się ją lepiej napisać czy może też jest w niej błąd, którego nie zauważyłem ;)
#include <iostream>
#include <list>
#include <cctype>
using namespace std;
list<string> FindHashtags(string text)
{
bool IsHashtag = false;
list<string>Result;
auto ResultPtr=Result.begin();
for(unsigned int i=0; i<text.length(); ++i)
{
if(text[i]=='#' && !isalnum(text[i-1]) && isalnum(text[i+1]))
{
Result.push_back(string());
++ResultPtr;
IsHashtag = true;
continue;
}
if(IsHashtag)
{
if(isalnum(text[i])) *ResultPtr+=text[i];
else IsHashtag = false;
}
}
return Result;
}
int main()
{
int j=0;
list<string>test=FindHashtags("Lorem ipsum dolor sit #amet, consectetur\
adipiscing elit. Curabitur #blandit posuere convallis. Sed #non orci sit amet neque eleifend luctus");
cout<<"Number of elements: "<<test.size()<<"\n";
for(auto i=test.begin(); i!=test.end(); ++i, ++j)
{
cout<<j<<": "<<*i<<"\n";
}
return 0;
}