08 strings o cadenas

H

cadenas string

8
                         Strings o Cadenas

8.1 ¿QUÉ SON LOS STRINGS?

En C no existe un tipo string como en otros lenguajes. No existe un tipo de
datos para almacenar texto, se utilizan arrays con el tipo de dato char.
Funcionan igual que los demás arrays con la diferencia que se utilizan letras
en vez de números.

Una cadena en C es una secuencia de cero o más caracteres seguidas por
un caracter NULL o 0:
Es importante preservar el caracter de terminación 0, ya que con éste es
como C define y maneja las longitudes de las cadenas. Todas las funciones
de la biblioteca estándar de C lo requieren para una operación satisfacto-
ria.
Por ejemplo la cadena de 5 elementos siguiente:

                        “H“   “O“   “L“     “A“   0

Declaración de Cadenas
Para declarar una cadena se hace como un array. La forma general de de-
clarar una cadena es la siguiente:

                         char nombre_cadena[longitud];



Por ejemplo la sentencia:
			                       char texto[20];
Declara la cadena texto de tamaño 20.

Además se debe tener en cuenta de considerar un elemento más al tamaño
de la cadena para el elemento 0 .


                                     119
Fundamentos de Programación

Inicialización de Cadenas
Para inicializar una cadena se puede hacer de la misma forma que se inicia-
liza un array y puede tenerse las siguientes formas:
      char cadena1[20] = “”;                         	 //cadena vacía
      char cadena2[20] = “esta es una cadena”;
      char cadena3[20] = ‘0’;
      char cadena4[ ] = { ‘a’, ’e’, ’i’, ’o’, ’u’ };

Asignación de Cadenas
A una cadena no se puede asignar un valor directamente con el signo =,
sino que se debe hacer a través de la función strcpy(), que se encuentra en
la librería <string.h>. En el caso de C++ se debe utilziar la libreria <cstring>
Ejemplo: En el programa implementado en Dev C++ se muestra el uso de
esta función:
       #include <iostream>
       #include <cstring> //para usar la función strcpy()

      using namespace std;

      int main(int argc, char *argv[])
      {
           char nombre[21];
      	    //nombre = “Juan Perez”;               //ERROR
      	    strcpy( nombre, “Juan Perez”);         //OK

        cout<<nombre;			                           //Imprime en pantalla
      						                                       //Juan Perez
        system(“PAUSE”);
        return EXIT_SUCCESS;
      }

8.2 OPERACIONES CON CADENAS

Al igual que con arrays se puede realizar las mismas operaciones básicas:
   •	 	ngreso de datos.
      I
   •	 	 ecorrido y procesamiento.
      R
   •	 	mpresión de la cadena.
      I

Ingreso de datos
Para ingresar datos en C se puede hacer uso de la función gets( ).
		              char cad1[20];

                                      120
8: Strings o Cadenas
		               printf(“Ingrese cadena 1:”);
		               gets(cad1);

En C++ podemos utilizar la función getline(), combinada con cin.
		           char cad1[20];
		           cout<<“Ingrese cadena 1:”;
		           cin.getline(cad1,20);

Recorrido de cadanas
Para recorrer una cadena podemos hacerlo como:
	       for(i=0; cadena[i]!=‘0’; i++)

		               O lo que es lo mismo:

	        for(i=0; cadena[i]; i++)

Salida de cadenas
Para escribir cadenas podemos utilizar en C la función puts( )
		              printf(“La cadena es: ”);
		              puts(cad1);

En C++ hacer uso de cout directamente
		               cout<<“La cadena es”<<cad1;
Ejemplo
El siguiente ejemplo lee una cadena y luego calcula el tamaño de la cadena
ingresada:
      #include <iostream>
      using namespace std;

     int main(int argc, char *argv[])
     {
         char cad1[60]; int i=0;
         cout<<”Ingrese cadena:”;          gets(cad1);
         for( i=0; cad1[i] != ‘0’; i++ );
         cout<<”La cadena Ingresada es “;          puts(cad1);
         cout<<”El tamaño es “<<i;

         system(“PAUSE”);
         return EXIT_SUCCESS;
     }


                                      121
Fundamentos de Programación

8.3 FUNCIONES DE CADENAS

Todas las funciones para manejo de cadenas tienen su prototipo en:
			                    #include <string.h>
Si es en C++ en #include <cstring>

Las funciones más comunes son:

  •	 char *strcpy(const char *dest, const char *orig) Copia la cadena de
     caracteres apuntada por orig (incluyendo el carácter terminador ‘0’) al
     vector apuntado por dest. La cadena de destino, debe ser suficiente-
     mente grande como para alojar la copia.
  •	 int strcmp(const char *s1, const char *s2) Compara las dos cadenas
     de caracteres s1 y s2. Devuelve un entero menor, igual o mayor que
     cero si se encuentra que s1 es, respectivamente, menor que, igual a,
     o mayor que s2.
  •	 char *strerror(int errnum) Devuelve un mensaje de error que corres-
     ponde a un número de error.
  •	 int strlen(const char *s) Calcula la longitud de la cadena de caracte-
     res.
  •	 char *strncat(char *s1, const char *s2, size_t n) Agrega n caracteres
     de s2 a s1.
  •	 int strncmp(const char *s1, char *s2, size_t n) Compara los primeros n
     caracteres de dos cadenas.
  •	 char *strncpy(const char *s1, const char *s2, size_t n) Copia los pri-
     meros n caracteres de s2 a s1.
  •	 strcasecmp(const char *s1, const char *s2) versión que ignora si son
     mayúsculas o minúsculas de strcmp().
  •	 strncasecmp(const char *s1, const char *s2, size_t n) versión insensi-
     ble a mayúsculas o minúsculas de strncmp() que compara los prime-
     ros n caracteres de s1.

Ejemplo:

#include <stdio.h>
void main()
{
  char cad[80];
  int i=0,vocal=0,consonante=0;
  printf(“Ingrese cadena”);
  gets(cad);

                                    122
8: Strings o Cadenas
    for( i=0; cad[i] != ‘0’; i++)
    {
      if(( cad[i]>=’a’ && cad[i]<=’z’) || (cad[i]>=’a’ && cad[i]<=’z’))
	              switch(cad[i])
	                { case ‘A’: case ‘a’:
		                      case ‘E’: case ‘e’:
		                      case ‘i’: case ‘I’:
		                      case ‘O’: case ‘o’:
		                      case ‘U’: case ‘u’: vocal++; break;
	                   default: consonante++;
	                 }
	             }
  	         printf(“Vocales %dn”,vocal);
         printf(“Consonantes %d”,consonante);
}

8.4 EJERCICIOS DE PROGRAMACIÓN RESUELTOS

1 Programa que lee y escribe el nombre, dirección y teléfono de una per-
sona.

   #include <iostream>
   using namespace std;
   int main(int argc, char *argv[])
   {
      char nombre[50];
      char direccion[150];
      char telefono[10];

       cout<<”Nombre : “; cin.getline(nombre,50);
       cout<<”Dirección : “; cin.getline(direccion,150);
       cout<<”Telefono : “; cin.getline(telefono,10);

       cout<<”nnEl nombre es : “<<nombre<<endl;
       cout<<”La direccion es : “<<direccion<<endl;
       cout<<”El telefono es    : “<<telefono<<endl;

       system(“PAUSE”);
       return EXIT_SUCCESS;
   }


                                             123
Fundamentos de Programación

2 Programa que muestras el uso de las funciones de cadenas en C.

   #include <iostream>
   using namespace std;
   int main(int argc, char *argv[])
   {
       string texto1, texto2 = “Hola “, texto3(“Que tal”);

        texto1 = texto2 + texto3 + “ estas? “;
        cout << texto1 << “n”;
        string subcadena (texto1, 2, 6); // 6 letras de texto1, desde la tercera
        cout << subcadena << “n”;
        string subcadena2;
        subcadena2 = texto1.substr(0, 5); //5 letras de texto1, desde el comienzo
        texto1.insert(5, “Juan “); // Inserto un texto en la posicion 6
        cout << texto1 << “n”;
        texto2.replace(1, 2, “ad”); // Cambio 2 letras en la posicion 2
        cout << texto2 << “n”;
        cout << “La longitud de texto1 es “ << texto1.size() << “n”;
        cout << “La tercera letra de texto1 es “ << texto1[2]
             << “ o bien “ << texto1.at(2) << “n”;
        if (texto2 == “Hada “)
           cout << “Texto 2 es Hadan”;
       system(“PAUSE”);
       return EXIT_SUCCESS;
   }

 3 Programa que lee una cadena desde el teclado y cuente el número de
caracteres de tres categorías: letras (a-z y A-Z), dígitos (0-9) y otros caracte-
res (espacios en blanco y caracteres especiales ?%..). Utilice las funciones
isdigit() e isalpha().

   #include <iostream>
   #define MAXCAD 80
   using namespace std;
   int main(int argc, char *argv[])
   {
      char linea[MAXCAD], *pc=linea;
      int digitos=0, letras=0, otros=0;
      cout<<”nEscriba una cadena (menor a “<<MAXCAD<<” caracteres):n”;
      gets(linea);

                                              124
8: Strings o Cadenas
       while (*pc != ‘0’) {
         if (isdigit(*pc))
              ++digitos;
         else
              if (isalpha(*pc))
                   ++letras;
              else
                   ++otros;
         ++pc;
       }
       cout<<”ntDigitos = “<<digitos
         <<”ntLetras = “<<letras
         <<”ntOtros = “<<otros<<”nn”;

       system(“PAUSE”);
       return EXIT_SUCCESS;
   }

 4 Programa que lea una cadena y busque un carácter en ella. Solo da
como salida el primer caracter encontrado, en caso de existir más de uno.

   #include <iostream>
   using namespace std;
   int main(int argc, char *argv[])
   {
      char caract, cadena[80], *ptr;
      cout<<”Introduzca la cadena donde se va a buscar:n”;
      gets(cadena);
      cout<<”nEscriba el caracter a buscar:n”;
      caract=getchar();
      ptr=strchr(cadena, caract);
      if (ptr==0)
           cout<<”El caracter “<<caract<<” no se encuentra en la cadena.n”;
      else
           cout<<”La posicion del caracter es “<<ptr-cadena+1<<”nn”;

       system(“PAUSE”);
       return EXIT_SUCCESS;
   }



                                            125
Fundamentos de Programación

 5 Programa que pide una cadena por el teclado y la imprima después de
convertir el primer carácter en mayúscula y el resto en minúsculas.
Por ejemplo, ante la entrada “hola MAMA“ devuelve la cadena: “Hola
mama“

   #include <iostream>
   #define MAXCADENA 20
   char *ConversionLetra(char *cadena);

   using namespace std;

   int main(int argc, char *argv[])
   {
      char tmp[MAXCADENA+1];
      /* Se suma 1 para el byte NUL */
      cout<<”nEscriba una cadena (de “<<MAXCADENA
         <<” caracteres maximo) y teclee INTRO:n”;
      gets(tmp);
      cout<<”n”<<ConversionLetra(tmp)<<”nn”;
      system(“PAUSE”);
      return EXIT_SUCCESS;
   }

   char *ConversionLetra(char *cadena)
   {
      char *pc;
      pc=cadena;
      *pc=toupper(*pc);
      ++pc;
      while (*pc != ‘0’){
          *pc = tolower(*pc);
          ++pc;
      }
      return(cadena);
   }

 6 Programa que compruebe si una cadena introducida por teclado es o no
un palíndromo. Un palíndromo es una cadena que se lee igual al derecho
que al revés. Por ejemplo:
   “reconocer”
   “110010011”

                                          126
8: Strings o Cadenas
  “anita lava la tina”
  “dábale arroz a la zorra el abad”
Observación: Ingresar la cadena sin espacios en blanco

   #include <iostream>
   #define TAM 40
       char palin[TAM];
       int longitud,a=0;
       int cont;
   using namespace std;
   int main(int argc, char *argv[])
   {
       cout<<”nIngrese una palabra:nn”;
       gets(palin);
       longitud=strlen(palin);
       for(cont=longitud-1;palin[cont]==palin[a] && cont>=0;cont--,a++);
          if(a==longitud){
              cout<<”nEs un palindromon”;
         }else{
              cout<<”nNo es palindromon”;
         }
      system(“PAUSE”);
      return EXIT_SUCCESS;
   }

 7 Programa que convierte de un número ROMANO ingresado por teclado
a un número ARÁBIGO en formato decimal. Una entrada válida sería XXVII
y la salida sería: 27.

   #include <iostream>
   #include <cstring>
   using namespace std;
   int main(int argc, char *argv[])
   {
      char romano[10];
      long int arabigo=0;
      char caracter;
      int longitud;
      system(“CLS”);
      cout<<”Ingrese el numero romano: “; cin>>romano;
      longitud=strlen(romano);

                                           127
Fundamentos de Programación

       for(int i=longitud-1;i>=0;i--) {
           caracter=romano[i];
           switch(caracter) {
              case ‘M’: arabigo+=1000; break;
              case ‘D’: if(i<longitud-1 && romano[i+1]==’M’)
                          arabigo-=500;
                      else
                          arabigo+=500; break;
              case ‘C’: if(i<longitud-1 && strchr(“DM”,romano[i+1]))
                          arabigo-=100;
                      else
                          arabigo+=100; break;
              case ‘L’: if(i<longitud-1 && strchr(“CDM”,romano[i+1]))
                          arabigo-=50;
                      else
                          arabigo+=50; break;
              case ‘X’: if(i<longitud-1 && strchr(“LCDM”,romano[i+1]))
                          arabigo-=10;
                      else
                          arabigo+=10; break;
              case ‘V’: if(i<longitud-1 && strchr(“XLCDM”,romano[i+1]))
                          arabigo-=5;
                      else
                          arabigo+=5; break;
              case ‘I’: if(i<longitud-1 && strchr(“VXLCDM”,romano[i+1]))
                          arabigo-=1;
                      else
                          arabigo+=1; break;
           }
       }
       cout<<”El numero “<<romano<<” en arabigo es: “<<arabigo<<endl;
       system(“PAUSE”);
       return EXIT_SUCCESS;
   }




                                           128

Recomendados

Lab por
LabLab
Labyito24
296 vistas7 diapositivas
Informe tecnico por
Informe tecnicoInforme tecnico
Informe tecnicoSandra Guadalupe Canche Dzul
269 vistas27 diapositivas
Lecture 37 por
Lecture 37Lecture 37
Lecture 37Aldo Hernán Zanabria Gálvez
194 vistas15 diapositivas
Hechos en clase por
Hechos en claseHechos en clase
Hechos en claseŘỉgö VẻGầ
483 vistas13 diapositivas
Funciones str por
Funciones strFunciones str
Funciones strSharliemaster
9K vistas50 diapositivas
Arreglos en C++ por
Arreglos en C++Arreglos en C++
Arreglos en C++Santiago Sarmiento
1.2K vistas3 diapositivas

Más contenido relacionado

La actualidad más candente

Tema3 p2%20 por
Tema3 p2%20Tema3 p2%20
Tema3 p2%20Aldo Hernán Zanabria Gálvez
1.7K vistas51 diapositivas
Programar en c por
Programar en cProgramar en c
Programar en cOsvaldo Magaña Cantú
363 vistas2 diapositivas
Ejemplos Para Dev C++ por
Ejemplos Para Dev C++Ejemplos Para Dev C++
Ejemplos Para Dev C++cemayoral
243.9K vistas7 diapositivas
Tap u2-componentes y librerias-programa para cifrar y descifrar cadenas por
Tap u2-componentes y librerias-programa para cifrar y descifrar cadenasTap u2-componentes y librerias-programa para cifrar y descifrar cadenas
Tap u2-componentes y librerias-programa para cifrar y descifrar cadenasJosé Antonio Sandoval Acosta
308 vistas6 diapositivas
Ejercicios de programación. por
Ejercicios de programación.Ejercicios de programación.
Ejercicios de programación.Javier Cuenca
3K vistas7 diapositivas
Pract met de la program templa por
Pract met de la program templaPract met de la program templa
Pract met de la program templaIvan Ramirez Iglesias
280 vistas4 diapositivas

La actualidad más candente(19)

Ejemplos Para Dev C++ por cemayoral
Ejemplos Para Dev C++Ejemplos Para Dev C++
Ejemplos Para Dev C++
cemayoral243.9K vistas
Ejercicios de programación. por Javier Cuenca
Ejercicios de programación.Ejercicios de programación.
Ejercicios de programación.
Javier Cuenca3K vistas
Problemas+resueltos+de+c$2 b$2b por FRESH221 C.R
Problemas+resueltos+de+c$2 b$2bProblemas+resueltos+de+c$2 b$2b
Problemas+resueltos+de+c$2 b$2b
FRESH221 C.R436 vistas
Ejercicios en Netbeans por edgar muñoz
Ejercicios en NetbeansEjercicios en Netbeans
Ejercicios en Netbeans
edgar muñoz44.4K vistas
Clase 11- fundamentos de la programacion por diego MC
Clase 11- fundamentos de la programacionClase 11- fundamentos de la programacion
Clase 11- fundamentos de la programacion
diego MC1K vistas
Descubriendo scala por nluaces
Descubriendo scalaDescubriendo scala
Descubriendo scala
nluaces80 vistas
Programación en OTcl por Jesus Vilchez
Programación en OTclProgramación en OTcl
Programación en OTcl
Jesus Vilchez2.5K vistas
Informe tecnico victor_uex por victoruex
Informe tecnico victor_uexInforme tecnico victor_uex
Informe tecnico victor_uex
victoruex170 vistas
Funciones de Strings en PHP por Angie Mejia
Funciones de Strings en PHPFunciones de Strings en PHP
Funciones de Strings en PHP
Angie Mejia1.3K vistas
Ejercicios de programacion concurrente por edgar muñoz
Ejercicios de programacion concurrenteEjercicios de programacion concurrente
Ejercicios de programacion concurrente
edgar muñoz3K vistas

Destacado

Menos Buffer Overflows, más SQL Injections por
Menos Buffer Overflows, más SQL InjectionsMenos Buffer Overflows, más SQL Injections
Menos Buffer Overflows, más SQL InjectionsBonsai Information Security
347 vistas14 diapositivas
Understanding Advanced Buffer Overflow por
Understanding Advanced Buffer OverflowUnderstanding Advanced Buffer Overflow
Understanding Advanced Buffer OverflowConferencias FIST
403 vistas28 diapositivas
Bolanos marco tarea1 por
Bolanos marco tarea1Bolanos marco tarea1
Bolanos marco tarea1Marco Bolaños
254 vistas4 diapositivas
Historia de los buffer overflows por Juan Sacco por
Historia de los buffer overflows por Juan SaccoHistoria de los buffer overflows por Juan Sacco
Historia de los buffer overflows por Juan SaccoJuan Sacco
907 vistas29 diapositivas
Sistema buffer por
Sistema bufferSistema buffer
Sistema bufferIngrid Johana Sierra Mejia
5K vistas2 diapositivas
Castells manuel la era de la informacion tomo 2 por
Castells manuel   la era de la informacion tomo 2Castells manuel   la era de la informacion tomo 2
Castells manuel la era de la informacion tomo 2ProjectMart
20.8K vistas495 diapositivas

Destacado(20)

Historia de los buffer overflows por Juan Sacco por Juan Sacco
Historia de los buffer overflows por Juan SaccoHistoria de los buffer overflows por Juan Sacco
Historia de los buffer overflows por Juan Sacco
Juan Sacco907 vistas
Castells manuel la era de la informacion tomo 2 por ProjectMart
Castells manuel   la era de la informacion tomo 2Castells manuel   la era de la informacion tomo 2
Castells manuel la era de la informacion tomo 2
ProjectMart20.8K vistas
Basicos. ropa interior- productos bebe por milton_sss
Basicos. ropa interior- productos bebeBasicos. ropa interior- productos bebe
Basicos. ropa interior- productos bebe
milton_sss595 vistas
De los webs educativos al material didáctico web por Juan Cucuri
De los webs educativos al material didáctico webDe los webs educativos al material didáctico web
De los webs educativos al material didáctico web
Juan Cucuri402 vistas
Dsn wsj book por lraaron
Dsn wsj bookDsn wsj book
Dsn wsj book
lraaron605 vistas
Infrastructure and Investment Opportunities for Energy Efficiency in Buildings por Alliance To Save Energy
Infrastructure and Investment Opportunities for Energy Efficiency in BuildingsInfrastructure and Investment Opportunities for Energy Efficiency in Buildings
Infrastructure and Investment Opportunities for Energy Efficiency in Buildings
Prüfung elektrischer Einrichtungen | weyer spezial por weyer gruppe
Prüfung elektrischer Einrichtungen | weyer spezialPrüfung elektrischer Einrichtungen | weyer spezial
Prüfung elektrischer Einrichtungen | weyer spezial
weyer gruppe786 vistas
Ahs aoit internship guide 2011 por NAFCareerAcads
Ahs aoit internship guide 2011Ahs aoit internship guide 2011
Ahs aoit internship guide 2011
NAFCareerAcads2.2K vistas
Trisquelmedia: Experiencia de Usuario por Trisquelmedia
Trisquelmedia: Experiencia de UsuarioTrisquelmedia: Experiencia de Usuario
Trisquelmedia: Experiencia de Usuario
Trisquelmedia762 vistas
Gestione e manutenzione delle piscine por Lifenergy
Gestione e manutenzione delle piscineGestione e manutenzione delle piscine
Gestione e manutenzione delle piscine
Lifenergy643 vistas
Curso prático de direito previdenciário ivan kertzman - 2015 por celso dias
Curso prático de direito previdenciário   ivan kertzman - 2015Curso prático de direito previdenciário   ivan kertzman - 2015
Curso prático de direito previdenciário ivan kertzman - 2015
celso dias4.8K vistas

Similar a 08 strings o cadenas

Funciones cadena por
Funciones cadenaFunciones cadena
Funciones cadenaTutorial Html
176 vistas3 diapositivas
Cadenas por
CadenasCadenas
CadenasIng Arturo madrid
277 vistas16 diapositivas
Cadenas y punteros.ppt por
Cadenas y punteros.pptCadenas y punteros.ppt
Cadenas y punteros.pptJacqueline Villarroel Valenzuela
85 vistas56 diapositivas
Fundamentos de programación librería string C++ por
Fundamentos de programación librería string C++Fundamentos de programación librería string C++
Fundamentos de programación librería string C++Milton Nicolay
13.1K vistas11 diapositivas
Codigos de programas por
Codigos de programasCodigos de programas
Codigos de programasJhonathan Villalobos
785 vistas36 diapositivas
Codigos de programas por
Codigos de programasCodigos de programas
Codigos de programasJhonathan Villalobos
785 vistas36 diapositivas

Similar a 08 strings o cadenas(20)

Fundamentos de programación librería string C++ por Milton Nicolay
Fundamentos de programación librería string C++Fundamentos de programación librería string C++
Fundamentos de programación librería string C++
Milton Nicolay13.1K vistas
Comandos importantes en c++ por Andy Otañez
Comandos importantes en c++Comandos importantes en c++
Comandos importantes en c++
Andy Otañez8.4K vistas
Ejercicios programacion cortos por milanollarves
Ejercicios programacion cortosEjercicios programacion cortos
Ejercicios programacion cortos
milanollarves85 vistas
Practicas segundo parcial de programacion avanzada por Dariio Lopezz Young
Practicas segundo parcial de programacion avanzadaPracticas segundo parcial de programacion avanzada
Practicas segundo parcial de programacion avanzada
Dariio Lopezz Young539 vistas
!Prograc6 por robertoxe
!Prograc6!Prograc6
!Prograc6
robertoxe441 vistas
Fpr Tema6 www.fresymetal.com por FresyMetal
Fpr Tema6 www.fresymetal.comFpr Tema6 www.fresymetal.com
Fpr Tema6 www.fresymetal.com
FresyMetal994 vistas
6... producciones por derecha e izquierda por Jacqui Venegas
6... producciones por derecha e izquierda6... producciones por derecha e izquierda
6... producciones por derecha e izquierda
Jacqui Venegas210 vistas

08 strings o cadenas

  • 1. 8 Strings o Cadenas 8.1 ¿QUÉ SON LOS STRINGS? En C no existe un tipo string como en otros lenguajes. No existe un tipo de datos para almacenar texto, se utilizan arrays con el tipo de dato char. Funcionan igual que los demás arrays con la diferencia que se utilizan letras en vez de números. Una cadena en C es una secuencia de cero o más caracteres seguidas por un caracter NULL o 0: Es importante preservar el caracter de terminación 0, ya que con éste es como C define y maneja las longitudes de las cadenas. Todas las funciones de la biblioteca estándar de C lo requieren para una operación satisfacto- ria. Por ejemplo la cadena de 5 elementos siguiente: “H“ “O“ “L“ “A“ 0 Declaración de Cadenas Para declarar una cadena se hace como un array. La forma general de de- clarar una cadena es la siguiente: char nombre_cadena[longitud]; Por ejemplo la sentencia: char texto[20]; Declara la cadena texto de tamaño 20. Además se debe tener en cuenta de considerar un elemento más al tamaño de la cadena para el elemento 0 . 119
  • 2. Fundamentos de Programación Inicialización de Cadenas Para inicializar una cadena se puede hacer de la misma forma que se inicia- liza un array y puede tenerse las siguientes formas: char cadena1[20] = “”; //cadena vacía char cadena2[20] = “esta es una cadena”; char cadena3[20] = ‘0’; char cadena4[ ] = { ‘a’, ’e’, ’i’, ’o’, ’u’ }; Asignación de Cadenas A una cadena no se puede asignar un valor directamente con el signo =, sino que se debe hacer a través de la función strcpy(), que se encuentra en la librería <string.h>. En el caso de C++ se debe utilziar la libreria <cstring> Ejemplo: En el programa implementado en Dev C++ se muestra el uso de esta función: #include <iostream> #include <cstring> //para usar la función strcpy() using namespace std; int main(int argc, char *argv[]) { char nombre[21]; //nombre = “Juan Perez”; //ERROR strcpy( nombre, “Juan Perez”); //OK cout<<nombre; //Imprime en pantalla //Juan Perez system(“PAUSE”); return EXIT_SUCCESS; } 8.2 OPERACIONES CON CADENAS Al igual que con arrays se puede realizar las mismas operaciones básicas: • ngreso de datos. I • ecorrido y procesamiento. R • mpresión de la cadena. I Ingreso de datos Para ingresar datos en C se puede hacer uso de la función gets( ). char cad1[20]; 120
  • 3. 8: Strings o Cadenas printf(“Ingrese cadena 1:”); gets(cad1); En C++ podemos utilizar la función getline(), combinada con cin. char cad1[20]; cout<<“Ingrese cadena 1:”; cin.getline(cad1,20); Recorrido de cadanas Para recorrer una cadena podemos hacerlo como: for(i=0; cadena[i]!=‘0’; i++) O lo que es lo mismo: for(i=0; cadena[i]; i++) Salida de cadenas Para escribir cadenas podemos utilizar en C la función puts( ) printf(“La cadena es: ”); puts(cad1); En C++ hacer uso de cout directamente cout<<“La cadena es”<<cad1; Ejemplo El siguiente ejemplo lee una cadena y luego calcula el tamaño de la cadena ingresada: #include <iostream> using namespace std; int main(int argc, char *argv[]) { char cad1[60]; int i=0; cout<<”Ingrese cadena:”; gets(cad1); for( i=0; cad1[i] != ‘0’; i++ ); cout<<”La cadena Ingresada es “; puts(cad1); cout<<”El tamaño es “<<i; system(“PAUSE”); return EXIT_SUCCESS; } 121
  • 4. Fundamentos de Programación 8.3 FUNCIONES DE CADENAS Todas las funciones para manejo de cadenas tienen su prototipo en: #include <string.h> Si es en C++ en #include <cstring> Las funciones más comunes son: • char *strcpy(const char *dest, const char *orig) Copia la cadena de caracteres apuntada por orig (incluyendo el carácter terminador ‘0’) al vector apuntado por dest. La cadena de destino, debe ser suficiente- mente grande como para alojar la copia. • int strcmp(const char *s1, const char *s2) Compara las dos cadenas de caracteres s1 y s2. Devuelve un entero menor, igual o mayor que cero si se encuentra que s1 es, respectivamente, menor que, igual a, o mayor que s2. • char *strerror(int errnum) Devuelve un mensaje de error que corres- ponde a un número de error. • int strlen(const char *s) Calcula la longitud de la cadena de caracte- res. • char *strncat(char *s1, const char *s2, size_t n) Agrega n caracteres de s2 a s1. • int strncmp(const char *s1, char *s2, size_t n) Compara los primeros n caracteres de dos cadenas. • char *strncpy(const char *s1, const char *s2, size_t n) Copia los pri- meros n caracteres de s2 a s1. • strcasecmp(const char *s1, const char *s2) versión que ignora si son mayúsculas o minúsculas de strcmp(). • strncasecmp(const char *s1, const char *s2, size_t n) versión insensi- ble a mayúsculas o minúsculas de strncmp() que compara los prime- ros n caracteres de s1. Ejemplo: #include <stdio.h> void main() { char cad[80]; int i=0,vocal=0,consonante=0; printf(“Ingrese cadena”); gets(cad); 122
  • 5. 8: Strings o Cadenas for( i=0; cad[i] != ‘0’; i++) { if(( cad[i]>=’a’ && cad[i]<=’z’) || (cad[i]>=’a’ && cad[i]<=’z’)) switch(cad[i]) { case ‘A’: case ‘a’: case ‘E’: case ‘e’: case ‘i’: case ‘I’: case ‘O’: case ‘o’: case ‘U’: case ‘u’: vocal++; break; default: consonante++; } } printf(“Vocales %dn”,vocal); printf(“Consonantes %d”,consonante); } 8.4 EJERCICIOS DE PROGRAMACIÓN RESUELTOS 1 Programa que lee y escribe el nombre, dirección y teléfono de una per- sona. #include <iostream> using namespace std; int main(int argc, char *argv[]) { char nombre[50]; char direccion[150]; char telefono[10]; cout<<”Nombre : “; cin.getline(nombre,50); cout<<”Dirección : “; cin.getline(direccion,150); cout<<”Telefono : “; cin.getline(telefono,10); cout<<”nnEl nombre es : “<<nombre<<endl; cout<<”La direccion es : “<<direccion<<endl; cout<<”El telefono es : “<<telefono<<endl; system(“PAUSE”); return EXIT_SUCCESS; } 123
  • 6. Fundamentos de Programación 2 Programa que muestras el uso de las funciones de cadenas en C. #include <iostream> using namespace std; int main(int argc, char *argv[]) { string texto1, texto2 = “Hola “, texto3(“Que tal”); texto1 = texto2 + texto3 + “ estas? “; cout << texto1 << “n”; string subcadena (texto1, 2, 6); // 6 letras de texto1, desde la tercera cout << subcadena << “n”; string subcadena2; subcadena2 = texto1.substr(0, 5); //5 letras de texto1, desde el comienzo texto1.insert(5, “Juan “); // Inserto un texto en la posicion 6 cout << texto1 << “n”; texto2.replace(1, 2, “ad”); // Cambio 2 letras en la posicion 2 cout << texto2 << “n”; cout << “La longitud de texto1 es “ << texto1.size() << “n”; cout << “La tercera letra de texto1 es “ << texto1[2] << “ o bien “ << texto1.at(2) << “n”; if (texto2 == “Hada “) cout << “Texto 2 es Hadan”; system(“PAUSE”); return EXIT_SUCCESS; } 3 Programa que lee una cadena desde el teclado y cuente el número de caracteres de tres categorías: letras (a-z y A-Z), dígitos (0-9) y otros caracte- res (espacios en blanco y caracteres especiales ?%..). Utilice las funciones isdigit() e isalpha(). #include <iostream> #define MAXCAD 80 using namespace std; int main(int argc, char *argv[]) { char linea[MAXCAD], *pc=linea; int digitos=0, letras=0, otros=0; cout<<”nEscriba una cadena (menor a “<<MAXCAD<<” caracteres):n”; gets(linea); 124
  • 7. 8: Strings o Cadenas while (*pc != ‘0’) { if (isdigit(*pc)) ++digitos; else if (isalpha(*pc)) ++letras; else ++otros; ++pc; } cout<<”ntDigitos = “<<digitos <<”ntLetras = “<<letras <<”ntOtros = “<<otros<<”nn”; system(“PAUSE”); return EXIT_SUCCESS; } 4 Programa que lea una cadena y busque un carácter en ella. Solo da como salida el primer caracter encontrado, en caso de existir más de uno. #include <iostream> using namespace std; int main(int argc, char *argv[]) { char caract, cadena[80], *ptr; cout<<”Introduzca la cadena donde se va a buscar:n”; gets(cadena); cout<<”nEscriba el caracter a buscar:n”; caract=getchar(); ptr=strchr(cadena, caract); if (ptr==0) cout<<”El caracter “<<caract<<” no se encuentra en la cadena.n”; else cout<<”La posicion del caracter es “<<ptr-cadena+1<<”nn”; system(“PAUSE”); return EXIT_SUCCESS; } 125
  • 8. Fundamentos de Programación 5 Programa que pide una cadena por el teclado y la imprima después de convertir el primer carácter en mayúscula y el resto en minúsculas. Por ejemplo, ante la entrada “hola MAMA“ devuelve la cadena: “Hola mama“ #include <iostream> #define MAXCADENA 20 char *ConversionLetra(char *cadena); using namespace std; int main(int argc, char *argv[]) { char tmp[MAXCADENA+1]; /* Se suma 1 para el byte NUL */ cout<<”nEscriba una cadena (de “<<MAXCADENA <<” caracteres maximo) y teclee INTRO:n”; gets(tmp); cout<<”n”<<ConversionLetra(tmp)<<”nn”; system(“PAUSE”); return EXIT_SUCCESS; } char *ConversionLetra(char *cadena) { char *pc; pc=cadena; *pc=toupper(*pc); ++pc; while (*pc != ‘0’){ *pc = tolower(*pc); ++pc; } return(cadena); } 6 Programa que compruebe si una cadena introducida por teclado es o no un palíndromo. Un palíndromo es una cadena que se lee igual al derecho que al revés. Por ejemplo: “reconocer” “110010011” 126
  • 9. 8: Strings o Cadenas “anita lava la tina” “dábale arroz a la zorra el abad” Observación: Ingresar la cadena sin espacios en blanco #include <iostream> #define TAM 40 char palin[TAM]; int longitud,a=0; int cont; using namespace std; int main(int argc, char *argv[]) { cout<<”nIngrese una palabra:nn”; gets(palin); longitud=strlen(palin); for(cont=longitud-1;palin[cont]==palin[a] && cont>=0;cont--,a++); if(a==longitud){ cout<<”nEs un palindromon”; }else{ cout<<”nNo es palindromon”; } system(“PAUSE”); return EXIT_SUCCESS; } 7 Programa que convierte de un número ROMANO ingresado por teclado a un número ARÁBIGO en formato decimal. Una entrada válida sería XXVII y la salida sería: 27. #include <iostream> #include <cstring> using namespace std; int main(int argc, char *argv[]) { char romano[10]; long int arabigo=0; char caracter; int longitud; system(“CLS”); cout<<”Ingrese el numero romano: “; cin>>romano; longitud=strlen(romano); 127
  • 10. Fundamentos de Programación for(int i=longitud-1;i>=0;i--) { caracter=romano[i]; switch(caracter) { case ‘M’: arabigo+=1000; break; case ‘D’: if(i<longitud-1 && romano[i+1]==’M’) arabigo-=500; else arabigo+=500; break; case ‘C’: if(i<longitud-1 && strchr(“DM”,romano[i+1])) arabigo-=100; else arabigo+=100; break; case ‘L’: if(i<longitud-1 && strchr(“CDM”,romano[i+1])) arabigo-=50; else arabigo+=50; break; case ‘X’: if(i<longitud-1 && strchr(“LCDM”,romano[i+1])) arabigo-=10; else arabigo+=10; break; case ‘V’: if(i<longitud-1 && strchr(“XLCDM”,romano[i+1])) arabigo-=5; else arabigo+=5; break; case ‘I’: if(i<longitud-1 && strchr(“VXLCDM”,romano[i+1])) arabigo-=1; else arabigo+=1; break; } } cout<<”El numero “<<romano<<” en arabigo es: “<<arabigo<<endl; system(“PAUSE”); return EXIT_SUCCESS; } 128