Informatică, întrebare adresată de tabreafabian0, 8 ani în urmă

Daca eu am sirul s=crezi si am instructiunea strcpy(s+3,s+2) de ce imi afiseaza ccreeeee? ma asteptam sa imi afiseze creezi, practic imi doresc dublarea lui e.


0 1 2 3 4
c r e z i


s+3=zi\0
s+2=ezi\0

se copiaza caracter cu caracter...

z=e

i=z

\0=i


dupa logica asta imi da creezi


Totusi unde am gresit??

Răspunsuri la întrebare

Răspuns de andrei750238
5

► NU se recomanda folosirea strcpy in care ca argument sa ai acelasi sir de caractere. Depinzand de fiecare implementare e posibil ca operatia sa mearga corespunzator sau nu.

Spre exemplu, in Visual Studio 2022 programul de mai jos nu functioneaza corespunzator in timp ce pe un compiler online merge fara probleme [vezi imaginile atasate]:

#include <iostream>

#include <cstring>

using namespace std;

int main() {

   char s[10];

   strcpy(s, "crezi");

   strcpy(s + 3, s + 2);

   cout << s;

}

► Daca citesti documentatia de la strcpy :

"To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source."

Apeland functia cu "strcpy(s+3,s+2)", sursa (al doilea argument) se suprapune in memorie cu destinatia (primul argument). Nu stim in ce mod e implementata functia strcpy, daca aceasta incepe mutarea de la stanga sau de la dreapta. Noi presupunem ca se incepe de la stanga dar nu e mereu cazul.

► Cod care ar trebui sa functioneze (vezi ultima imagine):

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <cstring>

using namespace std;

int main() {

   char s[10], aux[10];

   strcpy(s, "crezi");

   strcpy(aux, s);

   strcpy(s + 3, aux + 2);

   cout << s;

}

In acest cod am folosit o variabila auxiliara pentru a retine sirul de caractere si a ne asigura ca nu citim si scriem in aceasi zona de memorie.

In C++ manipularea sirurilor de caractere folosind functiile din C precum strcpy(), strstr(), etc. NU este recomandata. In C++ avem avem clasa string care ofera o alternativa mult mai sigura, mai curata si mai intuitiva la vechile functii care au probleme de securitate si de functionalitate.

exemplu :
#include <iostream>

#include <string>

using namespace std;

int main() {

   string s;

   s = "crez";

   s.insert(s.begin() + 2, 'e');

   cout << s;

}

Anexe:
Alte întrebări interesante