Zadanie ze wskaźników – czemu kod wypisuje tylko pierszą literę imienia?

0

Siemka, powie mi ktos czemu ten kod nie działa? wypisuje tylko pierwsza literke imienia.

#include <iostream>
#include<memory>
#include<cstring>
#include<string>
using namespace std;

char *ptr(char name[]){
    char *wsk = new char;
    wsk = name;
    cin.getline(name, 81);
    return wsk;
}

int main()
{
    char imie[80];
    char *schowek = ptr(imie);

    cout<<*schowek;

    return 0;
}

0

wiem ze ma byc tak jak wklejonejest nizej, ale czemu?

#include <iostream>
#include<memory>
#include<cstring>
#include<string>
using namespace std;

char *ptr(char name[]){
    char *wsk = new char;
    wsk = name;
    cin.getline(name, 81);
    return wsk;
}

int main()
{
    char imie[81];
    char *schowek = ptr(imie);

    for(int i=0 ; i<strlen(imie); i++){
        cout<<*schowek;
        schowek++;
    }

    return 0;
}

1

Najpierw alokujesz tylko jeden znak char:

char *wsk = new char;

Potem błędnie przypisujesz pod ten wskaźnik obszar całej tablicy (której rozmiaru w tej chwili nie znasz...):

wsk = name;

Potem zwracasz cały pobrany obszar name, a zaalokowany wskaźnik na jeden znak jest gubiony:
Skutkuje to wyciekiem pamięci, bo obszar, który zaalokowałeś jako jeden znak był przechowywany w wsk, które teraz już tego obszaru nie pokazuje. Nie wiemy gdzie jest ten obszar, a taki zgubiony zaalokowany obszar nam "wycieka".

return wsk;

W funkcji main() tworzysz wskaźnik, pod który przypisujesz pojedynczy znak:

char *schowek = ptr(imie);

Aby następnie wyłuskać z niego jego wartość:

cout<<*schowek;

Weź pod uwagę, że wyłuskanie, które tutaj zrobiłeś powoduje, że ZAWSZE pobierać będziesz pierwszy znak. Ten kod nie wyświetli Ci imienia, nawet, gdyby schowek zawierał całe imie (a nie zawiera, co wyjaśniłem wcześniej).

0

okej czyli albo string albo pętla ktora wypisze wszystkie elementy chara?

0

Pomijając mniej istotne błędy:

cout<< schowek;

1 użytkowników online, w tym zalogowanych: 0, gości: 1