Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Operacja na stringu

Ostatnio zmodyfikowano 2013-10-24 14:12
Autor Wiadomość
zielonek12
Temat założony przez niniejszego użytkownika
Operacja na stringu
» 2013-10-23 16:58:34
Witam, tworząc sobie quiz konsolowy postanowiłem, że pytania będą ładowane z pliku. Każde pytanie(z odpowiedziami) to jeden wers w pliku. Wygląda to tak:
nr=pytanie=odp1=odp2=odp3=odp4
Odpowiedź 4 zawsze jest prawidłowa, np: 1=Co jest stolicą Polski=Kraków=Lublin=Gdańsk=Warszawa
Mój kłopot polega na tym, że nie bardzo wiem jak po pobraniu całej lini(getline) teraz powycinać odpowiednie fragmenty. Myślałem sobie początkowo, że podczas operacji nad daną linią będę wycinał dane od znaku równa się do znaku równa się... lecz niestety nawet nie wiem jak się za to zabrać, co użyć? Pokusiłbym się na sscanf'a ale w sumie usiłuje działać w c++(a sscanf jest z C?). Proszę o porady, w c++ działam od całych trzech dni :)

@Używam klasy string.
P-94395
Wasilek
» 2013-10-23 17:10:54
Pętla o ilości obrotów równym ilości znaków w stringu (jest na to funkcja) i sprawdzanie czy sprawdzany aktualnie znak jest '=' jeżeli tak to wszystkie poprzednie znaki wpisz do odpowiedniej zmiennej (np. "pytanie") i następnie skasuj wszystkie znaki razem z '=' i powtórz to 5 razy (bo 5 wycinków chcesz mieć)
P-94398
zielonek12
Temat założony przez niniejszego użytkownika
» 2013-10-23 17:17:18
Dzięki wielkie, pamiętasz może jak nazywa się funkcja na długość stringu? Bo do klasy string nie nada się strlen()?
P-94399
Wasilek
» 2013-10-23 17:22:19
P-94400
zielonek12
Temat założony przez niniejszego użytkownika
» 2013-10-23 17:30:00
Dziękować.
P-94403
zielonek12
Temat założony przez niniejszego użytkownika
» 2013-10-23 20:21:09
C/C++
for( int i = 0; i < zawartosc.size(); i++ )
{
    if( zawartosc[ i ] == '=' )
    {
        //" jeżeli tak to wszystkie poprzednie znaki wpisz do odpowiedniej zmiennej (np. "pytanie") i następnie skasuj (...)" ~ Nie wiem jak się za to zabrać szczerze mówiąc...
    }
}

@Próbowałem do tego jeszcze jedną pętle ale  wydaje mi się to niezbyt optymalne.

@edit:
Ostatnia próba:
C/C++
for( int i = 0; i < zawartosc.size(); i++ )
{
    if( zawartosc[ i ] == '=' )
    {
        for( int t = i; t < zawartosc.size(); t++ )
        {
            if( zawartosc[ t ] == '=' ) pyt + zawartosc[ i ];
           
        }
    }
}
Ale niestety lipa.
P-94416
pekfos
» 2013-10-23 20:35:05
substr() i erase()?

wydaje mi się to niezbyt optymalne.
Jakie to ma znaczenie, skoro nie potrafisz tego zrealizować w inny sposób? Rób jak umiesz. Dla małych porcji danych wszystko działa dostatecznie szybko.
P-94418
zielonek12
Temat założony przez niniejszego użytkownika
» 2013-10-23 21:40:31
Dzięki, substr() bardzo się przydało. Niby sobie to ogarnąłem(kod pewnie strasznie amatorski, ale zacząć jakoś trzeba) lecz i tak mam kłopoty. Proszę o pomoc troszkę... wrzucam funkcje, która losuje pytanie, wczytuje je z pliku i teoretycznie podstawowy ciąg znaków dzieli na 4 odpowiedzi i pytanie.
C/C++
void Game()
{
    fstream file;
    bool good();
    file.open( "pyt.txt" );
   
    string zawartosc;
    int t = 0;
    string test;
    int pytanie =(( rand() %( liczba - 1 ) ) + 1 );
   
    cout << endl << "Wylosowalem: " << pytanie << endl;
   
    if( file.good() == true )
    {
        while( !file.eof() )
        {
            getline( file, test );
            if( !test.size() ||( test[ 0 ] >= '0' && test[ 0 ] <= '9' ) )
            {
                t++;
                if( pytanie == t )
                {
                    getline( file, zawartosc );
                }
            }
        }
        cout << zawartosc;
       
        string pyt;
        string odp1;
        string odp2;
        string odp3;
        string odp4;
        int w[ 5 ];
        for( int q = 0; q < 5; q++ ) w[ q ] = 0;
       
        for( int i = 0; i < zawartosc.size(); i++ )
        {
            if( zawartosc[ i ] == '=' )
            {
                if( w[ 0 ] < 1 ) w[ 0 ] = i + 1;
                else if( w[ 1 ] < 1 ) w[ 1 ] =( i - 1 );
                else if( w[ 2 ] < 1 ) w[ 2 ] = i + 1;
                else if( w[ 3 ] < 1 ) w[ 3 ] = i - 1;
                else if( w[ 4 ] < 1 ) w[ 4 ] = i + 1;
               
            }
        }
       
        pyt = zawartosc.substr( w[ 0 ], w[ 1 ] - 1 );
        odp1 = zawartosc.substr( w[ 1 ], w[ 2 ] - 1 );
        odp2 = zawartosc.substr( w[ 2 ], w[ 3 ] - 1 );
        odp3 = zawartosc.substr( w[ 3 ], w[ 4 ] - 1 );
        odp4 = zawartosc.substr( w[ 4 ], zawartosc.size() );
       
        cout << "\nzawartosc pytania: " << pyt << endl;
        for( int z = 0; z < 5; z++ ) cout << w[ z ] << endl;
       
        cout << endl << odp1 << endl << odp2 << endl << odp3 << endl << odp4 << endl;
       
    }
}

Przy zawartości pliku:

1=Stolicą Polski jest=krakow=lublin=wilno=warszawa
2=Słowo 'koks' ma=2 litery=3 litery=5 liter=4 litery
3=Jesteś...=fajny=mniej fajny=miły=super

W konsoli mam: http://iv.pl/images​/49178349334648452085.jpg

Zechciałby ktoś pomóc laikowi w c++?
P-94423
« 1 » 2 3
  Strona 1 z 3 Następna strona