2011-01-20 71 views
7

En C i utilizado strcpy hacer una copia profunda de una cadena, pero es todavía 'bien' utilizar strcpy en C++ o hay mejores alternativas que debo utilizar en su lugar?Alternativa de strcpy en C++

+0

¿Se ha cancelado la cadena o no? http://stackoverflow.com/q/4691608/176769 – karlphillip

Respuesta

14

En C++, la manera más fácil es usar la clase std :: string en lugar de char *.

#include <string> 
... 
    std::string a = "Hello."; 
    std::string b; 
    b = a; 

La línea "b = a;" hace lo mismo que normalmente haría con Strcpy.

+4

Aparte de eso, strcpy es tan legal y peligroso en C++ como en C. –

+0

Por lo tanto, básicamente * siempre * hace una copia profunda cuando se asigna una cadena a otra variable, ok gracias :) – Aerus

+14

'std :: string''s' operator = 'en realidad no hace una copia profunda. Hace una copia contada de referencia (y por lo tanto, no hace exactamente lo que 'strcpy' hace). Si quiere hacer una copia profunda de un 'std :: string', necesita llamarlo así:' std :: string a = "Hello."; std :: string b; b = a.c_str(); 'para forzarlo a hacer una copia en lugar de simplemente copiar los punteros e incrementar el recuento de referencias. –

3

Si estás usando C++ cadenas, sólo tiene que utilizar el constructor de copia:

std::string string_copy(original_string); 

de operador de asignación

string_copy = original_string 

Si tiene que usar cadenas estilo C (es decir, las matrices de char terminadas en cero), entonces sí, simplemente use strcpy, o como una alternativa más segura, strncpy.

+0

Aah buena alternativa, no había pensado en eso :) – Aerus

2

Se sugiere utilizar strcpy_s porque además de los argumentos de origen y destino, tiene un argumento adicional para el tamaño del búfer de destino para evitar el desbordamiento. Pero esta sigue siendo probablemente la forma más rápida de copiar una cadena si está utilizando matrices/punteros.

Ejemplo:

char *srcString = "abcd"; 
char destString[256]; 

strcpy_s(destString, 256, srcString); 
16

pongo esto en el comentario anterior, pero sólo para el código legible:

std::string a = "Hello."; 
std::string b; 
b = a.c_str(); // makes an actual copy of the string 
b = a;   // makes a copy of the pointer and increments the reference count 

Así que si usted realmente quiere imitar el comportamiento de strcpy, que' Necesitaré copiarlo usando c_str();

ACTUALIZACIÓN

Cabe señalar que la norma C++ 11 prohíbe explícitamente el patrón común copia en escritura que se utilizó en muchas implementaciones de std::string previamente. Por lo tanto, las cadenas de recuento de referencias ya no están permitidas y lo siguiente creará una copia:

std::string a = "Hello."; 
std::string b; 
b = a; // C++11 forces this to be a copy as well 
+0

No creo que se pueda decir "' c_str() 'hace una copia": solo devuelve los datos brutos de 'char *'. Estos datos luego se pasan al constructor std :: string que realiza la copia real. Si no se copió, entonces b se invalidará tan pronto como se termine el alcance o se destruya. –

+1

No dije 'c_str()' hace una copia. Dije 'b = a.c_str()' hace una copia de la cadena. 'c_str()' no es el foco de la operación; el operador de copia de asignación es. –

+0

Pedí una edición para aclarar la pregunta. Siéntase libre de realizar una reversión si algo anda mal. –