Cadenas de caracteres en C++

Una cadena de caracteres en C/C++ es un array unidimensional de caracteres. En cada elemento del array se almacena un carácter de la cadena y a continuación del último carácter se añade un elemento más que contiene el carácter nulo.
El carácter nulo sirve como indicador de fin de cadena.
Las cadenas se declaran como un array unidimensional de tipo char.
Por ejemplo:
char titulo[30]; //titulo es un array de 30 caracteres como máximo.
char nombre[25]; //nombre es un array de 25 caracteres como máximo
Los arrays de caracteres pueden inicializarse cuando se declaran. Lo podemos hacer de dos formas: asignando valores a cada elemento o directamente mediante un literal de tipo cadena de caracteres.
Si se inicializa elemento a elemento no es necesario indicar el tamaño del array, el compilador asumirá que el array tiene tantos elementos como valores iniciales hemos indicado. Si queremos que el array pueda contener más caracteres entonces sí será necesario indicar el tamaño total en la declaración.
Ejemplos de inicialización de arrays de caracteres asignando valores a cada elemento:
char b[]={'L','u','n','e','s','\0'};
De forma gráfica el array que se crea es:

char c[10]={'M','a','r','t','e','s','\0'};
En este caso hemos indicado que el tamaño es 10 pero solo hemos proporcionado 7 caracteres. Los tres elementos restantes tomarán un valor indeterminado:
Ejemplos de inicialización de arrays de caracteres utilizando un literal:
char a[] = "Hola"; 
esta declaración crea el array:
Vemo que en este caso el carácter nulo se añade automáticamente.
char d[10] = "ENERO";
En este caso hemos indicado que el tamaño es 10 pero el literal solo tiene 5. El array que se crea es:

Cuando inicializamos un array de caracteres con un literal normalmente no se indica el tamaño. El sistema asigna el tamaño de forma automática. Esto incluye la reserva para el carácter nulo ‘\0’, que se añade automáticamente al final de cada cadena de caracteres. El nulo se debe poner de forma manual si se asigna carácter a carácter.
Los arrays de caracteres en C/C++ son de tamaño fijo y longitud variable. Esto significa que cuando declaramos un array de caracteres tendremos que indicar el tamaño máximo del array o sea el número de caracteres máximo que tendrá la cadena de caracteres más el carácter nulo. Pero esto no significa que este array no se pueda utilizar para contener una cadena más corta. El array seguirá teniendo un tamaño fijo pero su longitud será el de la cadena que contiene en cada momento.
Por ejemplo:
char d[10] = "ENERO";
d es un array de tamaño 10, es decir, podrá contener como máximo 10 caracteres y su longitud actual es 5.
Leer cadenas de caracteres por teclado.
Como una cadena se implementa en C++ como un array de caractres, podemos leer por teclado carácter a carácter utilizando el método get y asignar valores como los demás arrays, elemento a elemento.
Ejemplo de lectura de cadena de caracteres elemento a elemento:
#include <iostream>
using namespace std;
int main(void)
{
    char cadena[10];
    int i;
    for(i=0;i<9;i++) // máximo 9 caracteres
        cin.get(cadena[i]); // se lee por teclado un carácter y
                            // se guarda en el array
    cadena[i]='\0';  // debemos añadir el nulo al final
    cout << "Ha escrito: " << cadena << endl;
    system("pause");
}
Debemos asegurarnos de que las cadenas creadas carácter a carácter acaban con el carácter nulo. En el ejemplo, la cadena se ha declarado con un tamaño máximo de 10 caracteres por lo que solo se podrán guardar 9 caracteres ya que el último se debe reservar al carácter nulo.
También podemos asignar una cadena completa a un array de caracteres utilizando el método getline.
La forma general de uso de getline es:
cin.getline(cadena, num, carácter_final);
cadena es el array donde vamos a almacenar los caracteres.
getline lee una serie de caracteres desde el flujo de entrada y los almacena en la variable cadena. Se leen caracteres hasta el final del flujo, hasta el primer carácter que coincide con el carácter_final especificado, el cual se desecha ó hasta que se han leído num-1 caracteres.
getline añade el carácter nulo (\0) al final de la cadena extraída.
Utilizando getline para leer por teclado la cadena del ejemplo anterior escribiremos la instrucción:
cin.getline(cadena, 10, '\n');
El carácter final se puede omitir, si no aparece se supone que es \n :
cin.getline(nombre, 50);
Recorrer cadenas de caracteres
Por ser un array de caracteres puede recorrerse elemento a elemento hasta encontrar el nulo.
Ejemplo: Programa C++ que lee por teclado una cadena de caracteres y la guarda en el array cadena. A continuación lo recorre desde el principio y muestra cada carácter por pantalla hasta que encuentra el carácter nulo.
#include <iostream>
using namespace std;
int main(void)
{
    char cadena[30];
   
    cin.getline(cadena,30); //lectura de la cadena por teclado
                      //se asignarán 29 caracteres como máximo
                      //el carácter nulo se añade de forma automática
   
    //recorrido de la cadena de caracteres
    int i=0;               //variable índice para recorrer la cadena
    while(cadena[i]!='\0') //mientras no lleguemos al nulo
    {
         cout << cadena[i]; //se muestra el carácter
         i++;               //se incrementa el índice
    }
    cout << endl;
    system("pause");
}
Si lo que queremos es visualizar toda la cadena, no es necesario recorrerla carácter a carácter, simplemente podemos escribir:
cout << cadena;
Esta sentencia visualiza todos los caracteres de la cadena desde el primero hasta el carácter nulo. Si la cadena la hemos creado sin poner el nulo al final, se mostrará el contenido de la cadena seguido de basura.

10 comentarios:

  1. Buenas tardes,estoy haciendo un ejercicio de cadenas que no termino de resolver:
    Escribir un programa que, dado un array de 10 caracteres (introducidos a mano en el código), calcule cuántas veces aparece la secuencia AB. Por ejemplo, para el array
    A-A-B-B-B-B-A-B-A-B
    el resultado sería 3

    A ver si me podeis echar una mano.
    Gracias

    Char caracteres [10]= (" AAGHVHBBBB");
    int x, contador=0;
    for(x=0;x<10;x++)
    {

    ResponderEliminar
    Respuestas
    1. #include
      #include
      using namespace std;

      int contador(char *);

      char cadena[10];

      int main(){

      cout<<"Hay "<<contador(cadena)<<" series :\n";



      return 0;
      }



      int contador(char *hola){
      int contar=0;
      for(int i=0;i<10;i++){

      if(hola[i]=='A' && hola[i+1]=='B'){
      contar++;
      }
      }
      return contar;
      }

      Eliminar
  2. Aqui le dejo en video que explica como guardar, leer cadenas de caracteres, entre otras, espero que les sirva.
    https://www.youtube.com/watch?v=op_XpwkBPwM&t=259s

    ResponderEliminar
  3. Hola chicos, necesito que ke ayuden a resolver un programa que permita leer un correo electronico con 2 letra, 2 numeros, 2 caracteres*%- y el @ . Ejemplo lu24*%@------.--- sin el hotmail.com

    ResponderEliminar
  4. hola me podrian ayudar
    Suponga que la operación longitudCadena no está disponible. Escriba un algoritmo que calcule la longitud de una cadena, bajo el supuesto de que el terminador de cadena aparece en alguna casilla del arreglo.

    ResponderEliminar
  5. Gente pregunta estupida :v. Como puedo concatenar una cadena de caracteres desde una posición x de otra cadena de caracteres?
    Con la función strcat puedo especificar dicha posición? Ya se que esa función sirve para añadir o concatenar una cadena con otra
    Pero no se a la exactitud si puedo desde una posición de la cadena

    ResponderEliminar
  6. Disculpe quien me puede ayudar soy nuevo y estoy aprendiendo a programar y en c++
    una lista de 30 caracteres, cada uno representando un código quien me puede ayudar

    ResponderEliminar
  7. me pueden ayudar con este ejercicio...
    Llenar un arreglo con una cadena de caracteres de 20 elementos y buscar
    uno posición indicada por el usuario.

    ResponderEliminar
  8. Hola disculpa necesito que en un string se sumen los valores ejemplo " 12a34" y en ello indique el mayor y menor de los números y si es mayor que se multiplique por el numero factorial

    ResponderEliminar
  9. hola jejeje odio a mi profesora de modulo jsjs saludos <3

    ResponderEliminar