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

char* do tablicy

Ostatnio zmodyfikowano 2011-06-30 12:58
Autor Wiadomość
CTRL85
Temat założony przez niniejszego użytkownika
char* do tablicy
» 2011-06-29 15:29:11
To forum już mi wiele razy pomogło, więc piszę z durnym problemem, ale ja jestem ślepy i nie widzę co jest źle ;)

Mam taki kod (który działa):
C/C++
#include <iostream>
using namespace std;
int main()
{
    char tekst[] = "  ";
    string wyraz = "wyrazy:ktore:program:ma:podazielic";
    for( int i = 0; i < wyraz.length(); i++ )
         tekst[ i ] = wyraz[ i ];
    ////////////////////////////////////////////////////////////////////////////////
    char * schowek;
    char wyrazy[] = "";
    cout << tekst << "\n" << endl;
    schowek = strtok( tekst, ":" );
    while( schowek != NULL )
    {
        cout << schowek << endl;
        schowek = strtok( NULL, ":" );
    }
    system( "PAUSE" );
    return 0;
}

Chciałbym zapisać każdy wyraz w tablicy, ale wywala mi błędy zależy jak kombinuje :(

Z góry dziękuję za pomoc

CTRL85
P-34925
DejaVu
» 2011-06-29 15:45:57
Opcja 1. Poczytaj o dynamicznej alokacji pamięci.
Opcja 2. Poczytaj o kontenerze std::vector.
P-34928
CTRL85
Temat założony przez niniejszego użytkownika
» 2011-06-29 16:43:54
A co lepsze i łatwiejsze?
P-34934
DejaVu
» 2011-06-29 16:46:26
Lepsze jest to co rozumiesz na chwilę obecną.
P-34936
CTRL85
Temat założony przez niniejszego użytkownika
» 2011-06-29 16:49:29
To na razie nic nie umiem z tego :)
P-34938
Mrowqa
» 2011-06-29 16:59:20
C/C++
char tekst[] = "  "; // char[ 3 ] ( co sobie myslisz ? ze tak postawisz i masz nieskonczenie dlugi string ?? :P )
string wyraz = "wyrazy:ktore:program:ma:podazielic"; // tu jest na pewno wiecej niz 3 znaki
for( int i = 0; i < wyraz.length(); i++ )
     tekst[ i ] = wyraz[ i ]; // naruszasz pamiec - piszesz dalej niz mozesz ( tzn dalej niz tekst[ 2 ] )

Dalej nie sprawdzałem :P ( pomyśleć - tak banalny błąd :P )

Pozdrawiam,
Mrowqa
P-34942
CTRL85
Temat założony przez niniejszego użytkownika
» 2011-06-29 17:13:08
na swoje usprawiedliwienie dodam, że wcześniej miałem a:b, żeby zobaczyć, czy działa, a później, jak chciałem zoabczyć czy dobrze rozdziela większą liczbe wyrazów, to zapomniałem zmienić :P

EDIT

Zrobiłem coś takiego:

C/C++
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    char tekst[] = "                                                  "; //teraz już dobre, bo ma 50 znaków ;)
    string wyraz = "wyrazy:ktore:program:ma:podazielic";
    for( int i = 0; i < wyraz.length(); i++ )
         tekst[ i ] = wyraz[ i ];
    ////////////////////////////////////////////////////////////////////////////////
    vector < char *> wszystkie_wyrazy;
    char * schowek;
    cout << tekst << "\n" << endl;
    schowek = strtok( tekst, ":" );
    while( schowek != NULL )
    {
        wszystkie_wyrazy.push_back( schowek );
        schowek = strtok( NULL, ":" );
    }
    for( int i = 0; i < wszystkie_wyrazy.size(); i++ )
         cout << wszystkie_wyrazy[ i ] << endl;
   
    system( "PAUSE" );
    return 0;
}
P-34945
ison
» 2011-06-29 19:00:19
@up
zauważ co zwróci
C/C++
strlen( wszystkie_wyrazy.back() );
po podzieleniu wyrazów

//
koniecznie chcesz w programie używać cstringów? (char*)
ja bym to zrobił tak:
C/C++
#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::string wyrazy = "wyrazy:ktore:program:ma:podzielic"; //wyrazy do podzielenia
    std::vector < std::string > wyrazy_podzielone( 1 ); //wektor z podzielonymi wyrazami, początkowa wielkość 1 (dla 1 wyrazu)
    for( size_t i = 0; i < wyrazy.size(); ++i ) {
        if( wyrazy[ i ] == ':' ) wyrazy_podzielone.push_back( std::string() ); //jeśli napotkamy : to dodajemy miejsce dla kolejnego wyrazu
        else wyrazy_podzielone.back() += wyrazy[ i ]; //metoda back() zwraca referencję do ostatniego obiektu
       
    }
    for( size_t i = 0; i < wyrazy_podzielone.size(); ++i ) { //wypisujemy wszystkie wyrazy
        std::cout << wyrazy_podzielone[ i ] << std::endl;
    }
}
P-34959
« 1 » 2 3 4
  Strona 1 z 4 Następna strona