Pierwsze słowo

Odpowiedz Nowy wątek
2015-02-05 22:19
0

Mam następujący kod którym celem jest wyciągniecie pierwszego słowa. Niestety nie działa do końca poprawnie.


#include <iostream>
#include <string>
using std::string;

int main() {
    string word;
    string test("  Ala ma kota"); // nie dziala (wykrywa ' ')
  //string test(" Ala ma kota");  //  nie dziala ( wykrywa ' Ala' )
  //string test("Ala ma kota");   // dziala

    auto it = test.begin();
    while(!(*it == ' ' && !word.empty()))
    {
        word.push_back(*it);
        ++it;

    }
    std::cout << "Pierwsze slowo: '" << word << "'" << std::endl;
}

jak będzie poprawnie + czy da się to zrobić lepiej - ważna jest szybkość i relatywna czytelność

Pozostało 580 znaków

2015-02-05 22:24
2

http://www.cplusplus.com/reference/regex/regex_search/ ?
Możesz też wrzucic to do stringstream i wyciągnąć pierwszy element.
A "szybkie" będzie pewnie strtok http://www.cplusplus.com/reference/cstring/strtok/


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 2x, ostatnio: Shalom, 2015-02-05 22:25
Tylko stringstream, każde inne użycie to nadużycie. - satirev 2015-02-05 22:31

Pozostało 580 znaków

2015-02-05 22:36
0

@Shalom Dzięki, a teraz to samo z iteratorami? :]
potrzebuje iteratorów ponieważ będę chciał wyciągnąc pierwsze słowo od jakiejś pozycji, np. od środka.
Poza tym spośród zalinkowanych funkcji moje rozwiązanie wydaje mi się być najszybsze, Ponieważ zatrzymuje się gdy znajdzie, a reszta leci po całym

edytowany 4x, ostatnio: abbq, 2015-02-05 22:41

Pozostało 580 znaków

2015-02-05 22:42
3
#include <iostream>
#include <string>
using std::string;

int main() {
    string word;
    string test("  Ala ma kota"); // nie dziala (wykrywa ' ')
  //string test(" Ala ma kota");  //  nie dziala ( wykrywa ' Ala' )
  //string test("Ala ma kota");   // dziala

    string white = " \r\n\t";
    size_t idx1 = test.find_first_not_of(white);
    if (idx1 != string::npos)
    {
        size_t idx2 = test.find_first_of(white, idx1);
        if (idx2 == string::npos)
            idx2 = test.length();
        word = string(test, idx1, idx2-idx1);
    }

    std::cout << "Pierwsze slowo: '" << word << "'" << std::endl;
}
Brak iteratorów poza tym twoja spacja ma 3 znaki :D co pogorsza wydajność. To wyszukiwanie ma być do mini parsera. Szukam pierwszego słowa jako klucza, robię z resztą tekstu coś aż do napotkania ustalonego znaku np. ';' i ponownie szukam klucza. Dlatego też musi to być szybkie i niekoniecznie ładne. - abbq 2015-02-05 22:49
znajdź mi find_first_not_of na iteratorach to dostaniesz na iteratorach. nie widzę powodu dla którego to miałoby być powolne. - Azarien 2015-02-06 09:56

Pozostało 580 znaków

2015-02-06 11:19
4

cool, że lubicie bawić się w iteratory, białe znaki zamiast użyć streama

#include <iostream>
#include <sstream>

int main()
{
    std::string s = "   Ala ma kota";
    std::stringstream ss;
    ss << s;
    if(ss >> s) {
        std::cout << s;
    }

    return 0;
}

http://melpon.org/wandbox/permlink/hH0tvYBSKqohlWHA

Shalom już przecież podał to rozwiązanie. - satirev 2015-02-06 17:47
słowo daję, że tam nic nie byo o stringstream, albo jak zobaczyłęm regex to uznałem, że dalej nie czytam, zresztą, nie tylko ja tak pewnie zareagowałem - gośćabc 2015-02-06 18:06

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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