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.
Masz zaalokować pamięć na nowy string, skopiować dane, zwrócić wskaźnik. Wszystko opisane w zadaniu.
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;
}
@kq: mógłbyś jeszcze na to spojrzeć? Jestem w tym kompletnie zielony.
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
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.
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);
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;
}
Skompilowałeś to chociaż, o uruchomieniu nie mówiąc? :]
haha tak kompilowałem i nawet działa ale czy zgadza się z poleceniem
To nie ma prawa działać. https://wandbox.org/permlink/7YKx1w0msJ8DL7g3
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;
}
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...
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ś.
@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
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.
To dzięki! a możesz tylko wyjaśnić zapis string s(tab);
?
To konstruktor std::string
@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?
Nie, nie możesz zwracać referencji/wskaźnika do zmiennej lokalnej. W tym zadaniu musisz użyć new.
Źle.
Podpowiedź - prawidłowo tworzysz wskaźnik na char *ch
tylko pamiętaj, że tu definiujesz tablicę char-ów, a stringa potrzebujesz jednego.
Gdzie powinienem użyć new? Naprawdę jestem w tym zielony i ciężko mi się połapać.
Masz zwrócić wskaźnik, new
ewaluuje się do wskaźnika.
A co zwracam w moim kodzie? Adres?
Adres zmiennej lokalnej, a nie takiej zaalokowanej przez new.
Mógłbyś poprawić mój kod? Żebym zobaczył o co tutaj chodzi?
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.
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)
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.