Funkcja szukająca hashtagów z podanego tekstu - ocena kodu

0

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;
}

2

Przez [i-1] sypie się, gdy pierwszym znakiem tekstu jest #.

0

@mad_penguin: Dzięki za znalezienie błędu, poprawiłem to już :)

#include <iostream>
#include <list>
#include <cctype>
using namespace std;
list<string> FindHashtags(string text)
{
    bool IsHashtag = false;
    list<string>Result;
    auto ResultPtr=Result.begin();
    if(text[0]=='#' && isalnum(text[1]))
    {
        Result.push_back(string());
        ++ResultPtr;
        IsHashtag = true;
    }
    for(unsigned int i=1; i<text.length(); ++i)
    {
        if(IsHashtag)
        {
            if(isalnum(text[i])) *ResultPtr+=text[i];
            else IsHashtag = false;
        }
        if(text[i]=='#' && !isalnum(text[i-1]) && isalnum(text[i+1]))
        {
            Result.push_back(string());
            ++ResultPtr;
            IsHashtag = true;
        }
    }
    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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1