2010-08-11 23 views
10

cuál es la diferencia entre cadenas de C y cadenas de C++. Especialmente mientras se hace la asignación de memoria dinámica¿Cuál es la diferencia entre cadenas de C y cadenas de C++?

+0

¿Se refiere a la diferencia entre el uso de cadenas 'char *' y 'char []' en los dos idiomas, o la diferencia entre cadenas 'char' y' std :: string'? – dmckee

+1

Defina lo que quiere decir con "cadena C" y "cadena C++". Ambos (especialmente el último) son ambiguos. – strager

+0

Lea http://www.cplusplus.com/reference/string/string/ y http://www.macdonald.egate.net/CompSci/hstrings.html –

Respuesta

22

casi no saben por dónde empezar :-)

En C, las cadenas son sólo char matrices que, convencionalmente, terminan con un byte NUL. En términos de gestión de memoria dinámica, puede simplemente malloc el espacio para ellos (incluido el byte adicional). La gestión de memoria cuando la modificación de cadenas es su responsabilidad:

char *s = strdup ("Hello"); 
char *s2 = malloc (strlen (s) + 6); 
strcpy (s2, s); 
strcat (s2, ", Pax"); 
free (s); 
s = s2; 

En C++, cuerdas (std::string) son objetos con toda la gestión de memoria automática asociada y el control de lo que los hace mucho más seguro y más fácil de usar, especialmente para la principiante. Para la asignación dinámica, usar algo como:

std::string s = "Hello"; 
s += ", Pax"; 

sé lo que me había prefieren utilizar, éste último. Puede (si necesita uno) construir siempre una cadena C de std::string utilizando el método c_str().

+2

'std :: string' son objetos con ... – dmckee

+0

¡Maldito seas c_str()! –

6

C cadenas ++ son mucho más seguro, más fácil, y que soportan diferentes funciones de manipulación de cadenas, tales como añadir, buscar, copiar, concatenación, etc.

una diferencia interesante entre cadena de C y C++ cadena se ilustra con el siguiente de ejemplo

#include <iostream>        
using namespace std; 

int main() { 
    char a[6]; //c string 
    a[5]='y'; 
    a[3]='o'; 
    a[2]='b'; 
    cout<<a; 
    return 0; 
} 

salida »¿boRy¤ £ f · Pi» ¿

#include <iostream> 
using namespace std; 
int main() 
{ 
    string a; //c++ string 
    a.resize(6); 
    a[5]='y'; 
    a[3]='o'; 
    a[2]='b'; 
    cout<<a; 
    return 0; 
} 

salida chico

Espero que tengas el punto !!

+0

Este tipo de comportamiento de C es lo que causa errores como Heartbleed. – saolof

Cuestiones relacionadas