Wskaźniki, tablice char

0

Zadanie przygotowujące do kolokwium. Nie bardzo ogarniam wskaźniki, jakaś podpowiedź do tego zadania?
Napisz funkcję, która w argumencie będzie miała tablicę char i zwróci zwykły wskaźnik na
nowy/dynamiczny obiekt string z ciągiem znaków z argumentu. Zadbaj o usunięcie rezerwacji we
właściwym momencie.

1

Masz zaalokować pamięć na nowy string, skopiować dane, zwrócić wskaźnik. Wszystko opisane w zadaniu.

0

Zrobiłem coś takiego ale moja funkcja nawet nie zwraca wskaźnika, jakieś podpowiedzi???

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

string fs(char* tab, int r){
    string s;
    for(int i=0; i<strlen(tab); i++){
        s+=tab[i];
    }
    return s;

}
int main()
{
    int R=100;
    char* ch=new char [R];
    cin.getline(ch, R);
    cout<<fs(ch, R);
    return 0;
}

0

@kq: mógłbyś jeszcze na to spojrzeć? Jestem w tym kompletnie zielony.

0

Hmm, co ty Bracie @Tomek Nadrowski masz o tego kodu?? Przecie działa...
Jedyne co można lekko zoptymalizować to tworzenie std::stringa na podstawie przekazanego wskaźnika, i zwalniać pamięć przyznaną na new char[R]
https://onlinegdb.com/HkldI06NQ4

0

Tylko, że nie jest zgodny z poleceniem według mnie. Polecenie może i nie jest jakoś skomplikowane ale mój kod i tak chyba go nie spełnia.

1

A, o to chodzi. To też już prawie dobrze, tylko że tego stringa w funkcji musisz przerobić na wskaźnik - czyli deklaracja funkcji powinna być taka:

std::string* fs(const char *tab);
0

Coś takiego? Nie wiem czy dobrze, funkcja zwraca wskaźnik, tak jak w poleceniu ale nie mam całkowitej pewnośći.

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

string* fs(const char *tab){
    string *s;
    for(int i=0; i<strlen(tab); i++){
        s+=tab[i];
    }
    return s;

}
int main()
{
    int R=100;
    char* ch=new char [R];
    cin.getline(ch, R);
    cout<<fs(ch);
    return 0;
}

1

Skompilowałeś to chociaż, o uruchomieniu nie mówiąc? :]

0

haha tak kompilowałem i nawet działa ale czy zgadza się z poleceniem

0

To nie ma prawa działać. https://wandbox.org/permlink/7YKx1w0msJ8DL7g3

0

Czy raczej chodzi bardziej o to?

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

string* fs(char *tab){
    string *s=new string ;
    for(int i=0; i<strlen(tab); i++){
        s+=tab[i];
    }
    
    cout<<endl;

    return s;
    delete[]s;

}
int main()
{
    int R=100;
    char* ch=new char [R];
    cin.getline(ch, R);
    cout<<fs(ch);
    return 0;
}

1

Blisko, ale na razie przesuwasz wskaźnik, zamiast dopisywać znaki do stringa. Ponadto, tutaj za usunięcie stringa powinna odpowiadać funkcja go otrzymująca (tutaj: main()). Jest to ogółem słaby design, ale takie masz zadanie...

1

Mojego kodu z linka pokazującego, że nie ma potrzeby jechać znak po znaku przekazanego *char skoro std::string ma konstruktor przyjmujący taki parametr też widzę nie obczaiłeś.

0

@MasterBLB: patrzyłem na ten kod i nie za bardzo rozumiem ten zapis string s(tab); i ten kod zwraca stringa a nie wskaźnik

0
Tomek Nadrowski napisał(a):

@MasterBLB: patrzyłem na ten kod i nie za bardzo rozumiem ten zapis string s(tab); i ten kod zwraca stringa a nie wskaźnik

Zgadza się. Przerobienie tego zapisu na wskaźnik to twoje zadanie.

0

To dzięki! a możesz tylko wyjaśnić zapis string s(tab); ?

1

To konstruktor std::string

0

@MasterBLB: to już dobrze?

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

string *fs(char* tab)
{
    string s(tab);//przypisanie do stringa wartości z tab
    return &s;

}
int main()
{
    int R=100;
    char* ch=new char [R];
    cin.getline(ch, R);
    cout << fs(ch);
    //delete fs;
    return 0;
}

Tylko jeszcze jak usunąć tą rezerwację z polecenia?

1

Nie, nie możesz zwracać referencji/wskaźnika do zmiennej lokalnej. W tym zadaniu musisz użyć new.

1

Źle.
Podpowiedź - prawidłowo tworzysz wskaźnik na char *ch tylko pamiętaj, że tu definiujesz tablicę char-ów, a stringa potrzebujesz jednego.

0

Gdzie powinienem użyć new? Naprawdę jestem w tym zielony i ciężko mi się połapać.

0

Masz zwrócić wskaźnik, new ewaluuje się do wskaźnika. 🤔

0

A co zwracam w moim kodzie? Adres?

0

Adres zmiennej lokalnej, a nie takiej zaalokowanej przez new.

0

Mógłbyś poprawić mój kod? Żebym zobaczył o co tutaj chodzi?

0

Taka poprawka to de facto zrobienie zadania za ciebie. Jak tak chcesz, to poproś kq o przeniesienie tematu do działu https://4programmers.net/Forum/Og%C5%82oszenia_drobne , i ktoś chętny się znajdzie.

0
MasterBLB napisał(a):

Taka poprawka to de facto zrobienie zadania za ciebie. Jak tak chcesz, to poproś kq o przeniesienie tematu do działu https://4programmers.net/Forum/Og%C5%82oszenia_drobne , i ktoś chętny się znajdzie.

Myślę, że to jednak lekka przesada ;)

@Tomek Nadrowski, pomijając już fakt, że zadanie jest chore(string+new) to czarno widzę to kolokwium.

string* make_string(char* tab)
{
  if (tab)
  {
    auto ptr = new string{tab};
    delete[] tab;
    return ptr;
  }
  return nullptr;
}

PS. W sumie to powinno być noexcept + new(std::nothrow)

0

Bracie @tajny_agent może faktycznie wysyłać Tomka do ogłoszeń to lekka przesada...

Niemniej, do Twojego gotowca mam pewne zastrzeżenia - mym zdaniem popełniasz tutaj błędy projektowe:

  • usuwasz przekazany char *tab; co jeśli po wywołaniu tej funkcji ktoś będzie chciał użyć przekazany wskaźnik?
  • drobniejszy błąd, nie definiując parametru jako const char *tab dopuścisz do jego modyfikacji.

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