Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: d91 en 12 Mayo 2014, 03:48 am



Título: diferencia entre variables char y string en c++
Publicado por: d91 en 12 Mayo 2014, 03:48 am
Un saludo a todos, estoy un poco confundido entre el uso de una variable tipo string y una variable tipo char, desde que empece en c++ cualquier cadena la he guardado en un arreglo tipo char, pero ultimamente estuve estudiando el uso del namespace y vi que puedo usar con esto una variable tipo string donde tambien guardo una cadena siempre con cin como que si fuera un entero y no con fgets que utilizo cuando es un arreglo tipo char lo que no se ahora cuando usar un string o un arreglo tipo char para guardar el nombre de una persona por ejemplo. Asimismo muchos ejemplos que he visto solo declaran using namespace std; y despues declaran string a;  pero me da error les dejo un codigo aunque no se si estoy implementando de manera correcta el uso de namespace y de string y si corre
Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <conio>
  4.  
  5. namespace std{
  6.   string a;
  7.   }
  8. using namespace std;
  9.  
  10. int main() {
  11. cout << "Introduciendo palabra: ";
  12. cin>>a; // veo que me guarda hasta donde encuentre un espacio en blanco
  13. //a = "d 91";
  14.  
  15. cout << "Mostrando lo que tiene a: "<<a;
  16. getch();
  17.  
  18. return 0;
  19. }


Título: Re: diferencia entre variables char y string en c++
Publicado por: noele1995 en 12 Mayo 2014, 08:35 am
El include que necesitas es <string> (<cstring> es libreria de c), estas mezclando librerias de c++ y c, entre otras cosas string es una clase, no tiene un tamaño fijo la cadena, se ira redimensionando segun le asignemos valores, tambien tiene funciones miembro como size() que nos devolvera su tamaño por ejemplo, se puede igualar o comparar a otro string directamente (sin funciones como strcmp o strcpy...) entre otras cosas.

Un saludo


Título: Re: diferencia entre variables char y string en c++
Publicado por: eferion en 12 Mayo 2014, 08:48 am
C++ es un lenguaje orientado a objetos. Esto quiere decir que C++ permite la creación y uso de objetos para modelar y encapsular las diferentes funcionalidades de una aplicación.

Uno de estos objetos es la clase "string". La clase "string", simplificando, contiene internamente un puntero tipo char y un entero... algo así (escrito en C):

Código
  1. typedef struct
  2. {
  3.  char* puntero;
  4.  int longitud;
  5. }

Alrededor de este diseño, la clase "string" implementa una serie de funciones que facilitan enormemente el uso de cadenas de caracteres en una aplicación:

* Implementado el operador copia: hace innecesario el uso de la función strcpy

Código
  1. std::string cad1 = "abcd";
  2. std::string cad2;
  3.  
  4. // En vez de strcpy( cad1, cad2 );
  5. cad1 = cad2;

* Soporta iteradores: facilita su manipulación en bucles

* Gestiona memoria dinámica de forma interna: evita lagunas de memoria, buffer overflow, ...

* Implementa operaciones de búsqueda.

* Implementa operador comparación: permite comparar strings de forma más natural que C.

Código
  1. // En C++
  2. if ( cad1 == cad 2 )
  3.  
  4. // En C
  5. if ( strcmp( cad1, cad2 ) == 0 )

* Operadores de inserción: Permite componer cadenas de forma simple:

Código
  1. std::string cad;
  2.  
  3. cad << "Hola" << " " << "mundo";

Todas estas operaciones tienen su símil en un array de tipo char... pero hay que tener más cuidado al manipular un puntero a tipo char y, claro, no es lo mismo usar operadores que usar funciones.

Bueno, hasta aquí el comentario para desgranar un poco las diferencias entre la clase string y las cadenas tipo "char".

Las clases en C++, a diferencia de los tipos nativos ( int, char, char*, ... ), tienen un archivo de cabecera y una implementación. Para poder usar una clase necesitas, por tanto, incluir su archivo de cabecera en tu código. De otra forma el compilador no sabe cómo utilizar esa clase ( no conoce el tamaño que ocupa, necesario para hacer reservas en la pila, no conoce el formato ni la ubicación de las funciones, ... )

En el caso de la clase "string", tal y como te indicó noele1995, se encuentra en

Código
  1. #include <string>

Nota que los includes de la librería estándar de C++ no tienen ".h", es una diferencia básica entre C y C++.