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

problem z krotkim kodem, nie poprawnie kopiuje stringi

Ostatnio zmodyfikowano 2010-08-17 22:05
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
problem z krotkim kodem, nie poprawnie kopiuje stringi
» 2010-08-17 00:11:31
gdzie popelniam blad?
zapisuje cos do stringa,polowe kopiuje do drugiego stringa, tego drugiego stringa wrzucam do wektora stringow, a kiedy wyswietlam pozniej wektor - okazuje sie, ze wszytskie stringi sa takie same, jak ostatni string, pewnie cos banalnego, ale dzis juz nie mam sily wiecej myslec...
C/C++
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct S
{
    string str2;
};

int main()
{
    int t, n = 0;
    S * wskaznik = NULL;
    string str;
    vector < S *> wektor;
    cin >> t;
    while( t )
    {
        wskaznik = new S;
        cin >> str;
        for( int i = 0; i < str.length() / 2; i++ )
        {
            wskaznik->str2[ i ] = str[ i ];
        }
        wektor.push_back( wskaznik );
        cout << wektor[ n ]->str2.c_str() << endl;;
        t--;
        n++;
    }
    for( int i = 0; i < wektor.size(); i++ )
    {
        cout << wektor[ i ]->str2.c_str() << endl;
    }
    //+czyszczenie pamieci oczywiscie //
    return 0;
}
P-20898
malan
» 2010-08-17 00:54:50
C/C++
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct S
{
    string str2;
};

int main()
{
    int t = 0, n = 0;
    S * wskaznik = 0;
    string str;
    vector < S *> wektor;
    cin >> t;
    while( t )
    {
        wskaznik = new S;
        cin >> str;
       
        wskaznik->str2 = str.substr( 0, static_cast < int >( str.size() / 2 ) );
        /*for(int i=0; i<size; i++)
            {
              wskaznik->str2[i]=str[i];
              cout<<wskaznik->str2[i]<<endl;
            }*/
        wektor.push_back( wskaznik );
        cout << wektor[ n ]->str2 << endl;
       
        t--;
        n++;
    }
    for( int i = 0; i < wektor.size(); i++ )
    {
        cout << wektor[ i ]->str2 << endl;
    }
    //+czyszczenie pamieci oczywiscie //
    return 0;
}
4
jeden
je
dwa
d
trzy
tr
cztery
czt
//Output:
je
d
tr
czt
P-20899
dmx81
Temat założony przez niniejszego użytkownika
» 2010-08-17 19:09:11
dzieki, dziala oczywiscie. czyli wniosek taki, ze do kopiowania fragmentow stringow uzywac funkcji,ktora dopisales do kodu zamiast tej petli ktora mialem wczesniej...? tylko czy mozesz wyjasnic dlaczego? tworze za kazdym razem nowy obiekt, na ktory wskazuje wskaznik, pozniej dodaje obiekt do wektora obiektow, a wskaznik bedzie wskazywal na nastepny, dla upewnienia sie dawalem cout, zeby sprawdzac, co zostalo do wektora wpisane i zawsze tam bylo to, co akurat chcialem kopiowac, a wypisujac caly wektor na koniec, wypelniaja go elementy tylko ostatnio dodanego stringa,
P-20926
malan
» 2010-08-17 20:36:56
tylko czy mozesz wyjasnic dlaczego?
Szczerze Ci powiem, że też to zauważyłem dopiero teraz.

Skompiluj sobie ten kod:
C/C++
#include <string>
#include <iostream>

int main()
{
    std::string foo;
    std::string foo2( "This is my foo." );
   
    for( size_t i = 0; i < foo2.size(); i++ )
         foo[ i ] = foo2[ i ];
   
    std::cout << "[" << foo << "]";
    return 0;
};
Bum! Tylko dlaczego? Wniosek z tego taki, że... Może na przykładzie Ci pokaże:
C/C++
char * foo = 0;
char * foo2 = new char[ 15 ];
strcpy( foo2, "This is my foo." );
for( int i = 0; i < strlen( foo2 ); i++ )
     foo[ i ] = foo2[ i ];

Mam nadzieję, że zrozumiałeś moje przesłanie. Pop prostu wychodzisz poza zakres tablicy...
C/C++
wskaznik->str2
... jest jak foo w kodzie powyżej.

Teraz spróbuj skompilować to:
C/C++
#include <string>
#include <iostream>

int main()
{
    std::string foo;
    std::string foo2( "This is my foo." );
   
    foo.resize( foo2.size() );
    for( size_t i = 0; i < foo2.size(); i++ )
         foo[ i ] = foo2[ i ];
   
    std::cout << "[" << foo << "]";
    return 0;
};
P-20935
dmx81
Temat założony przez niniejszego użytkownika
» 2010-08-17 22:05:33
ok, dzieki za przyklady i za poswiecony czas, znowu cos nowego weszlo do glowy:)
P-20940
« 1 »
  Strona 1 z 1