Alocarea dinamică a matricei de caractere în clasă în C++ (Programare, C++, Array-Uri)

unicornication a intrebat.
a intrebat.

Încerc să-mi fac propria clasă string și încerc să creez constructorul. Până acum mă chinui puțin.

Am prototipurile funcțiilor mele definite într-un fișier antet, iar bufferul de variabile definit în fișierul antet astfel char *buffer;, , într-un nou fișier cpp încerc să definesc constructorul astfel:

mystring::mystring(const char *s)
{
    int counter = strlen(s)+1;
    *buffer = generate_c_array(counter);
}

char * mystring::generate_c_array(int size)
{
  return new char[size];
}

Practic, încerc să fac în așa fel încât buffer este o matrice de caractere de dimensiune s+1 și să conțină conținutul lui s urmat de un terminator nul. Totuși, acest lucru face ca programul meu să se blocheze.

Nu sunt sigur cum să atribui corect buffer-ul, pare corect acest lucru?

Comentarii

  • Care este scopul counter și a buclei sale for? – user2486888
  • @NickyC Număr numărul de elemente din matricea char transmisă constructorului, astfel încât să pot genera o matrice alocată dinamic de dimensiunea corectă. –  > Por unicornication.
  • @NickyC este un mod ofuscat de a scrie counter = strlen(s)+1; –  > Por largest_prime_is_463035818.
  • @unicornication de ce nu folosiți pur și simplu strlen? –  > Por TartanLlama.
  • @tobi303 probabil că este o idee mai bună haha nu mi-am dat seama! Am folosit a doua buclă for loop a constructorului –  > Por unicornication.
4 răspunsuri
dlmeetei

Puteți scrie pur și simplu codul dvs.

mystring::mystring(const char *s)
{
    sz = strlen(s) // sz- another data member, holds size
    buffer = new char[sz + 1];
    strcpy(buffer, s); // assuming s is null-terminated
}

Bucla for și contorul nu erau necesare, de fapt

Comentarii

  • Am încercat să fac buffer = new char[strlen(s) +1]; for(int i = 0; i < strlen(buffer);i++) { cout << buffer[i]; } și aceasta tipărește date de gunoi, este necesară referința pointerului? –  > Por unicornication.
  • Dacă doriți date, care trebuie să fie copiate, Nu a fost acolo în cod, actualizare acum –  > Por dlmeetei.
Zbynek Vyskovsky – kvr000

Vă atribuiți la caracterul specific în buffer, , nu la variabila buffer. Schimbați în:

buffer = generate_c_array(counter);

În afară de asta, strdup va face aceeași treabă pentru dvs., dar va trebui să dezalocați cu free(). În codul actual, de fapt, nu copiați cu adevărat, ci va trebui să faceți strcpy(buffer, s) dacă nu se utilizează strdup menționată mai devreme.

DennisS

De ce faci o buclă peste lungimea șirului de caractere s?

Dacă aveți nevoie de lungimea șirului, utilizați-o direct:

std::size_t length = strlen(s);
buffer = generate_c_array(length + 1);

// Copy your string:    
memcpy(buffer, s, length)

// Add the terminator character:  
buffer[length] = '';

maowtm
  1. Nu ați copiat conținutul…
  2. Dacă doriți să atribuiți un pointer ( ceea ce este ceea ce se întâmplă cu new vă oferă ) la un alt pointer, nu aveți nevoie de *.
  3. strncpy să facă copierea în locul tău.

mystring::mystring(const char *s)
{
    int counter = strlen(s)+1;
    char* buffer = generate_c_array(counter);
    strncpy(buffer, s, counter);
}

char * mystring::generate_c_array(int size)
{
  return new char[size];
}