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++
Respuesta
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.
Aparte de eso, strcpy es tan legal y peligroso en C++ como en C. –
Por lo tanto, básicamente * siempre * hace una copia profunda cuando se asigna una cadena a otra variable, ok gracias :) – Aerus
'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. –
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.
Aah buena alternativa, no había pensado en eso :) – Aerus
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);
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
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. –
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. –
Pedí una edición para aclarar la pregunta. Siéntase libre de realizar una reversión si algo anda mal. –
- 1. C - ¿Por qué strcpy() es necesario?
- 2. strcpy vs. memcpy
- 3. ¿Qué es strcpy en Java?
- 4. falla de segmentación con strcpy
- 5. AddressOf alternativa en C#
- 6. alternativa gettext lib en C?
- 7. ¿Alternativa a C, C++? Todo
- 8. alternativa C++ para pError()
- 9. Alternativa a C++ excepción
- 10. C# Servicios de Windows Alternativa
- 11. Por qué no hay controles de cordura en legado strcpy()
- 12. error: strcpy no se declaró en este ámbito
- 13. ¿Alternativa para C-key en Emacs?
- 14. Alternativa al hilo. ¿Dormir en C#?
- 15. ¿Hay alguna alternativa para dormir() en C?
- 16. Alternativa ligera a Manual/AutoResetEvent en C#
- 17. C/C++ alternativa a Apache Tika
- 18. boost :: alternativa opcional en C++ Standard Library
- 19. std :: vector alternativa para C
- 20. ¿Hay alguna alternativa a C?
- 21. C++ 11 alternativa a localtime_r
- 22. C#: alternativa a GenericType == null
- 23. NoSQL alternativa libre (alternativa a ravendb) para C# desarrollo
- 24. C/C++ ¿Alternativa libre a Lint?
- 25. C# alternativa de migraciones de carriles
- 26. ¿Hay una alternativa nativa de C++ al "memcmp" de C?
- 27. ¿Hay una alternativa de Boost.Bimap en C++ 11?
- 28. C#: Implementación de, o alternativa a, StrCmpLogicalW en shlwapi.dll
- 29. ¿Existe una función de suspensión alternativa en C a milisegundos?
- 30. ¿Qué es una alternativa de cremallera iónica en C#?
¿Se ha cancelado la cadena o no? http://stackoverflow.com/q/4691608/176769 – karlphillip