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

strncpy() - dziwne znaki

Ostatnio zmodyfikowano 2017-02-05 18:56
Autor Wiadomość
Lich555
Temat założony przez niniejszego użytkownika
strncpy() - dziwne znaki
» 2017-02-04 22:19:18
Witam.
Szczerze to nawet nie wiem, czy problem dotyczy funkcji strncpy() - tak jak to dałem w temacie - ale tak mi się wydaje.
Kod programu:
C/C++
#include <iostream>
#include <cstring>

using namespace std;

class instrum
{
public:
    void virtual wydaj_dzwiek() { cout << "cisza"; }
    //wirtualny destruktor
    virtual ~instrum() { cout << "Destruktor instrumentu\n"; }
};
//************************************
class skrzypce
    : public instrum
{
    char * nazwa;
public:
    //konstruktor rezerwujacy w pamieci miejsce na string okreslajacy nazwe instrumentu
    skrzypce( const char * firma )
    {
        nazwa = new char[ strlen( firma ) + 1 ];
        strncpy( nazwa, firma, sizeof( nazwa ) );
    }
    //destruktor (wirtualny) czyszczacy obszar pamieci zarezerwowany na nazwe instrumentu w konstruktorze
    ~skrzypce()
    {
        cout << "Destruktor skrzypiec + ";
        delete nazwa;
    }
    void wydaj_dzwiek() { cout << "tirli-tirli (" << nazwa << ")\n"; }
};
//************************************
class gwizdek
    : public instrum
{
public:
    void wydaj_dzwiek() { cout << "fiu-fiu\n"; }
};
//************************************
class gitara
    : public instrum
{
    char * nazwa;
public:
    //konstruktor
    gitara( const char * firma )
    {
        nazwa = new char[ strlen( firma ) + 1 ];
        strncpy( nazwa, firma, sizeof( nazwa ) );
    }
    //destruktor (witrualny)
    ~gitara()
    {
        cout << "Destruktor gitary + ";
        delete nazwa;
    }
   
    void wydaj_dzwiek() { cout << "brzedk-brzdek (" << nazwa << ")\n"; }
};
//************************************
int main()
{
    cout << "Definiujemy w zapasie pamieci trzy intsrumenty orkiestry\n" << endl;
   
    instrum * pierwszy = new skrzypce( "Stradivarius" );
    instrum * drugi = new gitara( "Ramirez" );
    instrum * trzeci = new gwizdek;
   
    cout << "Gramy polimorficznie!\n";
   
    pierwszy->wydaj_dzwiek();
    drugi->wydaj_dzwiek();
    trzeci->wydaj_dzwiek();
   
    cout << "\nKoncert sie skonczyl, likwidujemy instrumenty\n\n";
   
    delete pierwszy;
    cout << "****************************\n";
    delete drugi;
    cout << "****************************\n";
    delete trzeci;
   
    return 0;
}
Wiem, że nie powinienem wrzucać rezultatów programu w postaci screenów, ale proszę o wybaczenie, gdyż po prostu nie wiem co to są za znaki :D
http://i.imgur.com/I7WfGdl.png
Widać je w miejscu, gdzie powinny pojawić się nazwy instrumentów.
P-157345
mateczek
» 2017-02-04 22:26:13
nie podawaj rozmiaru przy wywoływaniu strcopy. Ta funkcja sama wie ile ma skopiować !!!
C/C++
strcpy( nazwa, firma ); // przykład bez podawania rozmiaru

i jeszcze jedna uwaga!!!
Tablice kasujemy tak
C/C++
cout << "Destruktor skrzypiec + ";
delete[] nazwa;
P-157346
Lich555
Temat założony przez niniejszego użytkownika
» 2017-02-05 10:00:45
Ja używam nie strcpy, ale strncpy. Z tego co wiem w tej funkcji trzeba podać rozmiar.
P-157358
mateczek
» 2017-02-05 10:24:01
Ja używam nie strcpy, ale strncpy. Z tego co wiem w tej funkcji trzeba podać rozmiar.
Myślałem, że w wyniku pomyłki lub literówki. Ale jak masz jakiś szczególny powód by używać właśnie tej funkcji to w takim razie podaj rozmiar tekstu nie rozmiar wskaźników.

C/C++
skrzypce( const char * firma )
{
    int rozmiar = strlen( firma ) + 1;
    nazwa = new char[ rozmiar ];
    strncpy( nazwa, firma, rozmiar );
}


kod testowy
C/C++
#include <iostream>
#include <cstring>

using namespace std;


int main()
{
    char * wsk1 = new char[ 20 ];
    char * wsk2 = new char[ 100 ];
    if( sizeof( wsk1 ) == sizeof( wsk2 ) ) {
        cout << "wskaźniki mają taki sam rozmiar";
    }
}
P-157359
Lich555
Temat założony przez niniejszego użytkownika
» 2017-02-05 18:56:23
Ok, działa. Wielkie dzięki za odpowiedź :)
P-157373
« 1 »
  Strona 1 z 1