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

[C++] Napisy w strutkturach, funkcje.

Ostatnio zmodyfikowano 2016-01-17 17:51
Autor Wiadomość
mateczek
» 2016-01-17 13:01:05
https://www.youtube.com/watch​?v=L9JvSHYLvuw

C/C++
char * nazwisko_slubne = new char[ strlen( c1.nazwisko ) + strlen( c2.nazwisko ) + 1 ];
// Ta jedynka to miejsce na dodatkowe 0 w stringu. Tak się pisze w C
//akurat rozmiar pamięci to nie jest wielki problem. Ale błędna deklaracja wskazuje na niezrozumienie istoty napisów zakończonych '/0'
//ponowie radę byś pomyślał o stringach miast luźnych wskaźników char* :P??

skoro napis ma rozmiar 15 to ostatnim znakiem jest napis[14]. Znakiem napis[15] jest znak '/0'.
Kopiując coś do znaku napis[strlen( c1.nazwisko ) + 1;] zostwiasz '/0' i z kopiowania nici :) 

P-143630
Kordian
Temat założony przez niniejszego użytkownika
» 2016-01-17 15:53:33
Nie mogę pisać w stringach, mam narzucone z góry chary. Rozmiar tablicy charów + 1 nie uwzględnia myślnika '-' między nazwiskami, zatem powinno być +2.

Kopiując coś do znaku napis[strlen( c1.nazwisko ) + 1;] zostwiasz '/0' i z kopiowania nici :)
Mógłbyś objaśnić? Nie wiem, o co Ci chodzi.
P-143641
mateczek
» 2016-01-17 16:09:09
C/C++
i = strlen( c1.nazwisko ) + 1; // z grubsza o to że ta jedynka tu wydaje mi się niepotrzebna!!!!
for( i; i < strlen( c1.nazwisko ) + strlen( c2.nazwisko ) + 2; i++ )
{
    nazwisko_slubne[ i ] = c2.nazwisko[ j ];
    j++;
}

nazwisko "kot" rozmiar ma 3 i w pamięci komputera wygląda tak: 'k','o','t','/0'
zmienna "i" początkowe = 3+1=4;
C/C++
nazwisko_sl[ 0 ] = 'k'
nazwisko_sl[ 1 ] = 'o'
nazwisko_sl[ 2 ] = 't'
nazwisko_sl[ 3 ] = '/0' // "-" powinien być tu
nazwisko_sl[ 4 ] = '-' //dalej bez znaczenia bo i tak żadna funkcja je jedzie dalej niż '/0';
zgaduje, że wynik kopiowania nie przynosi rezultatów?? dalej nazwisko_slubne jest równe c1.nazwisko ?? dobrze myślę ??
P-143642
Kordian
Temat założony przez niniejszego użytkownika
» 2016-01-17 16:57:28
Kopiowanie chyba działa, ale czytam dane z poza tablicy. Zgadzm się z Tobą co do kota, ale tutaj sytuacja wygląda inaczej: jesli osoba ma przyjąć podwójne nazwisko, np:
Kowalska-Pająk to mamy rozmiar pierwszego nazwiska (Kowalska=8), rozmiar drugiego(Pająk=5), bajt zerowy oznaczający koniec napisu i jeszcze jedno miejsce na '/-' czyli +2.
P-143645
mateczek
» 2016-01-17 17:51:41
musisz zastąpić 0 myślnikiem i dodać 0 na końcu !!!! jak chcesz taką metodą !!!
C/C++
#include<iostream>
#include<cstring>
using namespace std;

struct czlowiek {
    char * imie = NULL;
    char * nazwisko = NULL;
    ~czlowiek() {
        //delete[] imie;
        //imie=NULL;
        //delete[] nazwisko;
        //nazwisko =NULL;
    }
};

czlowiek uzupelnij( char * imie, char * nazwisko ) // to jest wogóle do bani !!! tworzysz obiekt tymczasowy dla którego rezerwujesz pamięć new
{
    czlowiek c;
    c.imie = new char[ strlen( imie ) + 1 ];
    c.nazwisko = new char[ strlen( nazwisko ) + 1 ];
    strcpy( c.imie, imie );
    strcpy( c.nazwisko, nazwisko );
    return c;
} //obiekt tymczasowy powinnien przestać istnieć // i nawet zwolnić pamięci nie można w destruktorze!!!!

void slub( czlowiek & c1, czlowiek & c2 ) {
    int roz = strlen( c1.imie );
    if(( c1.imie[ roz - 1 ] ) == 'a' ) {
        char * wsk = new char[ strlen( c2.nazwisko ) + strlen( c1.nazwisko ) + 2 ];
        strcpy( wsk, c1.nazwisko );
        int i = strlen( c1.nazwisko );
        int j = 0;
        wsk[ i ] = '-'; i++;
        for( int j = 0; j < strlen( c2.nazwisko ); j++ )
        {
            wsk[ i ] = c2.nazwisko[ j ];
            i++;
        }
        wsk[ i ] = '\0';
        delete[] c1.nazwisko;
        c1.nazwisko = wsk;
    }
}
int main() {
   
    czlowiek c1 = uzupelnij( "Anna", "Kowalska" );
    czlowiek c2 = uzupelnij( "Jan", "Bracki" );
    slub( c1, c2 );
    cout << c1.imie << " " << c1.nazwisko << endl;
    delete[] c1.imie;
    delete[] c2.imie;
    delete[] c1.nazwisko;
    delete[] c2.nazwisko;
    return 0;
}
P-143658
1 « 2 »
Poprzednia strona Strona 2 z 2