Tablica dynamiczna w funcji, return vs delete.

0

Witam serdecznie, moim problemem jest to, że mam funkcję przyjmującą parametr char* i zwracającą char*, wszystko niby działa tylko, że nie mam pojęcia gdzie mam w tej funkcji wstawić delete []. Proszę o pomoc, oto kod:

/*Napisz funkcję przyjmującąparametr typu char*. Używając operatora new,
przydziel dynamicznie pamięć tablicy znaków o takiej samej wielkości,
jak tablica znakowa przekazana funkcji. Wykorzystując indeksowanie tablic,
skopiuj znaki argumentu do dynamicznie przydzielonej tablicy (nie zapomnij
o zerze, kończącym tablicę znakową) i zwróć wskaźnik do utworzonej w ten
sposób kopii. Przetestuj napisaną funkcję w obrębie funkcji main(),
przekazującjej statycznątablicę znakową znajdującą się w cudzysłowie,
a zwróconą wartość przekaż z powrotem swojej funkcji. Wydrukuj oba
łańcuchy i oba wskaźniki w taki sposób, aby było widać, że są to różne
obszary pamięci. Zwolnij całąprzydzielonądynamicznie pamięć, używając
do tego operatora delete.*/

#include<iostream>
using namespace std;

char* kopiuj(char*);

int main()
{
    char lancuch[50];
    cout<<"Wpisz jakis lancuch:"<<endl;
    gets(lancuch);
    cout<<"Wyswietlam skopiowany string: "<<endl;
    cout<<kopiuj(lancuch)<<endl;
    getchar();
}
char* kopiuj(char* lancuch)
{
    char *w;
    int i=0;
    while(lancuch[i]!=EOF)
    {
        i++;
    }
    w = new char[i];
    for(int j=0;j<=i;j++)
    {
        w[j]=lancuch[j];
    }
    return w;
}
 
1

Z cała pewnością to nie działa: "(nie zapomnij o zerze, kończącym tablicę znakową)"

char *cp=kopiuj(lancuch);
cout<<cp<<endl;
delete[] cp;
char *kopiuj(char lancuch[])
  {
   size_t len=1;
   while(lancuch[len]) ++len; // len=strlen(lancuch)+1;
   char *cpy=new char[len];
   for(size_t i=0;i<len;++i) cpy[i]=lancuch[i]; // memcpy(cpy,lancuch,len);
   return cpy;
  }
0

Po co tak kombinować?

char *kopiuj(char lancuch[])
{
  char *cpy=new char[strlen(lancuch)+1];
  int i=0;
  while((cpy[i]=lancuch[i])) ++i;
  return cpy;
}
0

@zonkoo22, po pierwsze przeczytaj zadanie, wyraźnie powiedziane - wykorzystując indeksowanie.
Po drugie, już ci mówiłem skoro skracasz, to skracaj:

char *kopiuj(char lancuch[]) { return strcpy(new char[strlen(lancuch)+1],lancuch); }
0
_13th_Dragon napisał(a):

Z cała pewnością to nie działa: "(nie zapomnij o zerze, kończącym tablicę znakową)"

char *cp=kopiuj(lancuch);
cout<<cp<<endl;
delete[] cp;

Dzięki! O to mi właśnie chodziło :)

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