5

He visto 2 formas para declarar cadenas de caracteres.

#include<iostream>
using namespace std;
int main(){

    string nombre;

    cout<<"Introduce tu nombre: ";
    cin>>nombre;

    cout<<"\nHola "<<nombre<<endl;

    return 0;
}

Y la segunda forma que he visto:

#include<iostream>
#include<string.h>
using namespace std;
int main(){

    char nombre[25];

    cout<<"Introduce tu nombre: ";
    cin.get(nombre, 25, '\n');

    cout<<"\nHola "<<nombre<<endl;

    return 0;
}

¿Cuales son las ventajas de usar una u otra? ¿Cual es más recomendada o menos obsoleta?

Trauma
  • 25,297
  • 4
  • 37
  • 60
Edgar Chacin
  • 103
  • 2
  • 5
  • Por lo general el uso de arrays crudos en C++ moderno está desaconsejado cuando existen contenedores en la stdlib para ellos. Esto se aplica a arrays de caracteres con string, pero también a otros tipos con el uso de std::vector, std:array, std:list, etc. std::string trabaja internamente con un array también, pero lo maneja por tí (incluida la memoria (dinámica en este caso)), además de proveer de métodos de ayuda como reverse, replace, etc que tendrías que construir por ti mismo si usas arrays. Por norma general usa string. – FJSevilla Apr 09 '20 at 08:13

1 Answers1

4

He visto 2 formas para declarar cadenas de caracteres.

Las cadenas de caracteres no se declaran, las cadenas de caracteres son. En concreto, en las cadenas de caracteres pertenecen a la categoría de literal.

Una vez aclarado ese punto, cabe destacar que en C++ los literales de cadena de texto tienen un tratamiento especial1. El tipo de datos de estos literales es tipo_de_caracter[tamaño], por lo tanto:

  • El tipo de "Hola" es char[5].
  • El tipo de L"Mundo" es wchar_t[6].

Fíjate que el tamaño es la cantidad de letras de la palabra mas uno, esto es porque en el literal de cadena se almacena también el carácter nulo ('\0' en el caso de char o L'\0' en el caso de wchar_t). Otra característica de los literales de texto es que no son modificables y que su espacio de memoria se reserva en tiempo de compilación.

Ahora veamos tus ejemplos:

1
string nombre;

cout<<"Introduce tu nombre: ";
cin>>nombre;
2
char nombre[25];

cout<<"Introduce tu nombre: ";
cin.get(nombre, 25, '\n');

En el primer caso no estás usando una cadena de caracteres, usas un objeto std::string cuyo cometido es gestionar caracteres con un búfer interno y que se adapta dinámicamente a las necesidades ampliando o reduciendo el búfer o realojando memoria. En el segundo caso tampoco estás usando una cadena de caracteres si no una formación2 de venti-cinco caracteres, esta formación es de tamaño fijo y no puede alojar más datos ni reajustarse dinámicamente.


1De hecho, los literales de cadena de texto (por su complejidad) son tratados de manera especial en todos los lenguajes de programación que conozco.

2También conocida como arreglo o en inglés array.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82