Home
Username:
Password:
C Programming (Español) Tutorials

Elementos Básicos de un Programa del C / Cadenas

Subtitles of the Movie

Otro tipo de datos del C es la cadena. Esta se utiliza para almacenar palabras o texto como un nombre, una direccionÉ o algun texto que necesitemos, no necesariamente el texto de un libroÉ sino caracteres extranos, signos de puntuacion, caracteres no imprimibles o un caracter ASCII. Estos elementos se almacenan en una cadena, pero esta no es un tipo de datos sino un derivado del tipo de datos "char". Recuerde que el "char" almacena un solo caracter como la letra "p", una barra diagonal, etc. Una cadena es un conjunto de dichos caracteres, tecnicamente denominado arreglo. Aun no hemos visto los arreglos, pero los veremos en el proximo capituloÉ aunque los mencionamos brevemente ahora. Una cadena es un arreglo de caracteres, pero existe un aspecto que diferencia estos dos conceptos. Una cadena es un arreglo de caracteres finalizado con un caracter "null". Un caracter "null" es un caracter especial que indica el valor cero. No el digito 0. como en la cifra 0123456789 sino el primer caracter del conjunto ASCII. Por eso se le llama caracter cero, aunque lo denominaremos caracter "null". Vamos al compilador para ver como declarar, utilizar y manipular las cadenas. Este es un programa sencillo del C muy similar al programa "Hello World" que vimos. He cambiado la funcion "printf" para desplegar "This is a Basic Program" en vez de "Hello World". Aun tenemos los elementos "fflush", "getchar" e "#include stdio.h". Vamos a utilizar este programa como plantilla para futuros programas del C porque tiene los elementos necesarios, asi que cuando le solicite crear un nuevo programa desde cero, puede abrir el archivo "basic.c"É que he almacenado con dicho nombre en el CD. He guardado este archivo como "string.c" y lo utilizaremos como ejemplo de la utilizacion de cadenas. Observe que ya existe una cadena en este programa. Me refiero a la frase de color rojo "This is a basic program". Esta es una cadena. Cualquier texto entre comillas dobles en un programa del C es una cadena, en este caso, una cadena literalÉ en el sentido de que el texto literal dentro de la cadena es codificado en el codigo fuente. Esta cadena consta de 5 palabras: "This is a basic program"É seguidas por una barra diagonal invertida y la letra "n". Veamos algunos aspectos no tan obvios de esta cadena en particular. La barra diagonal y la letra "n" son interpretados como un solo caracter por el compilador del C. Los escribimos pulsando las dos teclas respectivas y estos lucen como dos caracteres en la pantalla, pero el compilador los lee como un solo caracter. Cuando este encuentra una barra diagonal invertida en una cadena, la ve como un caracter especialÉ correspondiente a la letra "n" para indicar el ingreso de una nueva lineaÉ y los toma como un solo caracter de salto de linea. Este es el primer aspecto no tan obvio. Tambien tenemos la referencia al caracter "null". Vimos su significado, pero no vimos su importancia. Este tambien se denomina caracter de finalizacion o de terminacion "null". Se ubica al final de un arreglo de caracteres para designar el final del mismo, es decir, para designar la longitud de la cadena. Tenemos "This is a basic program" y un salto de linea; de hecho, tenemos un caracter "null" al final aunque no lo podemos ver. Vamos a contar la cantidad de caracteres de esta cadena. Tenemos 23 caracteres visibles incluyendo esta letra "m". Luego tenemos un caracter de salto de linea, asi que son 24. Al final tenemos un caracter "null" que no podemos ver ubicado por el compilador, asi que son 25. La cantidad total de memoria de esta cadena en particular es de 25 bytes. Es interesante conocer este dato. Antes de dejar el tema del caracter "null", es importante que al declarar una cadena dejemos un lugar para dicho caracter. Si necesitamos 100 bytes de espacio para almacenar una cadena, debemos declararla con una longitud de 101 bytes. Veamos como declarar una cadena. Primero, esta debe ser de tipo "char" porque va a contener caracteres. No me refiero a un "char" sencillo sino a un arreglo de valores "char". ÀPara que podemos utilizar este arreglo? Digamos que para el nombre de una persona, asi que a esta variable la llamamos "name". Si ubicamos aqui un punto y coma, habremos declarado un solo caracter como la letra "p", un caracter de subrayado, un caracter de nueva linea o incluso un caracter "null". No queremos un solo caracter sino un arreglo de caracteres, asi que abrimos y cerramos un par de corchetes. Asi designamos un arreglo, pero no hemos terminado, pues nos falta especificar el tamano del mismo. No hemos definido cuantos caracteres queremos. ÀCuantos caracteres son razonables para un nombre? Si queremos el primer nombre de una persona, Àcuantos caracteres necesitamos? Es importante conocer dicha cantidad. Debemos definir un limite para el numero de caracteres que puede leer este programa como un primer nombre. Debemos definir un numero, ya sea diez, cien, mil o un millon. Para utilizar eficientemente la memoria, debemos pensar en el menor numero que cubra todas las opciones posibles. ÀQue tan grande es el mayor nombre posible? Aunque no es muy importante, veamos: un nombre puede tener hasta 20 caracteres, asi que creamos un arreglo de 20 caracteres, pero hemos olvidado algo; como mencione, necesitamos 20 caracteres para un nombre, pero debemos tener un caracter para el "null", asi que debemos cambiarlo a 21É para indicar 20 caracteres para el nombre y 1 para el "null". Podemos conservar el valor 20É y aun tendriamos 1 caracter para el "null", dejando 19 para el nombre. Esto depende de la especificacion. Si se nos solicita un programaÉ en el que el nombre deba tener 20 caracteres, debemos declarar la cadena con el valor 21 para dejar espacio para el "null". Esta es una declaracion completa de una cadena. Tenemos el tipo de datos "char", luego el nombre de la variable "name" y abrimos un corchete. Luego incluimos la longitud del arreglo incluyendo el espacio para el "null" y cerramos el corchete. Veamos como utilizar esta cadena. Escribimos "name = Mark". ÀEsto esta bien? Este puede parecer el procedimiento obvio, pero de hecho es incorrectoÉ y no tiene que ver con que el nombre "Mark" no tenga 20 caracteres. Veamoslo con mas detalle. Primero, debemos incluir unas comillasÉ como en esta funcion "printf" o en la declaracion de la cadena. Debemos declarar una cadena literal entre comillas. De lo contrario, si las eliminamos, estariamos asignando a la variable "name"É el valor de la variable "Mark", es decir, el programa asume que hay una variable llamada "Mark", la cual no existe. Si esta existe, se intentara extraer su contenido y colocarlo dentro de "name". Se extraera el contenido de la caja "Mark" y se duplicara en la caja "name". No queremos eso porque no existe la variable "Mark"; esta es una cadena literal, asi que la ubicamos entre comillas. Sin embargo, aun es incorrecto porque "name" es un arreglo. No podemos asignar valores a los arreglos utilizando el signo de igualdad; solo podemos utilizarlo con variables individualesÉ como un "int" o un "char" sencillo. No podemos utilizar el signo de igualdad con los arreglos. Debemos emplear otra tecnica; veamos como hacerlo. Escribimos "strcpy", abrimos parentesisÉ e incluimos una coma. Eliminamos el signo de igualdad, cerramos el parentesis y ahora el nombre esta correcto. La palabra "strcpy" es una abreviacion de la instruccion de copia de cadenas. Esta es una funcion de la biblioteca de funciones estandar del CÉ que copia el contenido de una cadena dentro de otra cadena. En este caso, copia la cadena literal "Mark" dentro de la variable "name". Esto se efectua de derecha a izquierda, asi que este es el remitente y este el destinatarioÉ como si hubiera un signo de igualdad indicando que "name" es igual a "Mark". Los datos viajan hacia la direccion izquierda. Esta es la forma correcta de escribirlo: "name", una coma y "Mark". Asi asignamos la cadena "Mark" a la variable "name". Veamos si esto funciona correctamente y lo hacemos mediante la funcion "printf". Si disenamos la funcion "printf" correctamente, podremos ver el contenido de la variable "name". Escribimos "The contents of name are" y haremos lo mismo que al utilizar valores enterosÉ cuando escribimos "%d", una coma y la variable "age". ÀLo recuerda? Haremos casi lo mismo, pero obviamente no utilizaremos la variable "age"É sino la variable "name" que no es un entero sino una cadena. El codigo "%d" solo se utiliza con enteros, pues recuerde que la letra "d" indica un valor decimal. Esto es incorrecto porque se refiere a un entero, pero en este caso la letra "d" se refiere a un numero. La variable "name" no se refiere a un numero, asi que en vez de la letra "d" ingresamos la letra "s" para indicar una cadena. La sentencia "printf" desplegara el contenido de la variable "name", asi que deberemos obtener la frase "The contents of name are Mark". No estoy seguro si esto es correcto gramaticamente, pero esa es la idea. Veamos si funciona como esperamos. Compilamos, obtenemos errores y luego ejecutamos el proyecto. Obtenemos "The contents of name are Mark". El programa funciona como esperamos. Ya vimos como declarar una cadena como esta, como asignar una variable a una cadena de esta maneraÉ y como desplegar el contenido de una cadena. ÀQue mas podemos hacer con las cadenas? He preparado otro programa para demostrar otras formas de manipularlas. Me refiero al archivo "string2.c" que he abierto en este momento. Aqui lo tenemos. Observe que este es mas extenso; veamos. He creado este archivo para demostrar otros usos de las cadenas y en particular algunas funciones de la biblioteca estandar del C. Vimos una funcion relacionada con las cadenas denominada "strcpy"É que asigna una cadena a otra cadena. Existen otras dos funciones relacionadas llamadas "strcat" y "strlen". La funcion "strcat" se encarga de concatenar o adicionar dos cadenas por sus extremos. Puede pensar en esto como si unieramos el final de un elemento con el inicio de otro. En este caso, adicionamos la variable "name" al final de la variable "string2". Estamos extendiendo una cadena al agregarle otra. La funcion "strcat" se utiliza para concatenar una cadena de 1 caracter que puede parecer una cadena de 2 caracteres; el nuevo caracter es la nueva linea, es decir, tenemos dos caracteres siendo el segundo un caracter "null" que es invisible. Asignamos una cadena de 2 caracteres al final de la variable "string2", concatenandola en su extremo final. Aqui tenemos otra funcion denominada "strlen". Esta se encarga de contar y desplegar el numero de caracteres de una cadena. Basicamente, nos indica la longitud de una cadena a excepcion del caracter "null". Esta incluye el caracter de nueva linea si este existe, pero no incluye el caracter "null". De hecho, incluye todos los caracteres del conjunto ASCII excepto el caracter "null". Esta linea es inusual porque no hemos visto esta estructura. Las funciones que hemos visto en este cursoÉ como "strcpy", "printf", "scanf", "fflush" y "getchar" son llamadas de una manera diferente a esta. Aqui llamamos a una funcion y la ubicamos a la derecha del signo de igualdad. Luego ubicamos un entero al otro lado del signo. Tal vez usted sepa lo que ocurre. La funcion "strlen"É se encarga de restituir un valor. Una vez realizadas las acciones respectivas, la funcion restituye una informacion. Esta funcion simplemente adiciona la variable "name" al final de la variable "string2", pero no restituye ningun valor. En cambio, esta funcion restituye un entero con la longitud de dicha cadena, el cual asignamos mediante el signo de igualdad a la variable "length" que tenemos aqui. Recuerde que asignamos los valores enteros mediante sentencias como "length = 4"É o "length = 4000". Ahora tenemos "length", el signo de igualdad y el resultado de una funcion. Ahora veamos la sentencia "printf". Tenemos "printf the length of the string" y luego dos signos mayor queÉ seguidos por dos signos menor que con un signo de porcentaje en el centro. Estos signos solo estan alli por decoracion y no realizan ninguna accion. Son caracteres especiales que nos indican el inicio y el final de la cadena. Aqui obtendremos una representacion completa de la cadena de la variable "string2", la cual se ubicara dentro de estos signos que podriamos llamar delimitadores. Veamos el contenido de la variable "string2" al ejecutar el programa. La inicializamos en la funcion "strcpy" y comienza con el texto "My name is" y un espacio. Al final le adicionamos la variable "name" a la cual asignamos el valor "Mark" para obtener "My name is Mark". Luego incluimos un caracter de salto de linea al final de la frase "My name is Mark". Este es el texto que aparecera dentro de esos delimitadores seguido por "is" y un cierto numero de caracteres. Recuerde que el codigo "%d" despliega un entero, el cual corresponde a la longitud ubicada en la variable "length". Sera una representacion completa de la cadena seguida por el numero de caracteres. Hallamos el contenido de las variables "string2" y "length" en el mismo proceso. Veamos si funciona. Compilamos el archivo mediante este boton, no obtenemos errores y ejecutamos el programa. Obtenemos "My name is Mark" y "The length of the string My name is Mark is 16 characters". Observe que despues de la palabra "Mark" tenemos un salto de linea porque este hace parte de la cadena. Los signos delimitadores aparecen en la siguiente linea. Este comportamiento se debe al contenido de la cadena. Regresamos al programa y vamos a corregir ese pequeno error aqui. Aqui tenemos una linea interesante. No hemos utilizado la sentencia "printf string2" de esta manera, pues solo la hemos utilizado con una cadena literal. Tenemos comillas, "The length of the string", etc., pero recuerde este texto que vimos referente a las cadenas. La funcion "printf" requiere que el primer parametro sea una cadena. Esta cadena "string2" esta bien y hemos construido una cadena que contiene una nueva linea, asi que la utilizamos. Tenemos "printf string2" y esta funciona bien como acabamos de ver. Vimos que las cadenas son arreglos de caracteres que contienen un caracter de finalizacion "null" al final. Tambien que no podemos utilizar el signo de igualdad para asignar un valor a una cadena sino que utilizamos la funcion "strcpy". La unica manera de manipular cadenas es utilizar rutinas de la biblioteca estandar del CÉ como "strcpy", "strlen", "strcat" y "printf" que ya vimos, aunque hay muchas masÉ que podemos encontrar en el archivo de encabezado llamado "string.h". Si usted tiene el libro "C Standard Library Reference" revise el apartado "string.h" para ver una gran lista de funciones. Nunca olvide el caracter "null", aunque algunas veces este es manejado automaticamente por funciones comoÉ "strcpy", "strlen", "strcat" y "printf"; las cadenas literales lo contienen de manera predeterminada, pero en ocasiones construiremos cadenas caracter por caracterÉ y tendremos que insertar cada uno individualmente, letra por letra como "M" "a" "r" y "k" en este caso. Podemos pensar que en la "k" el trabajo termino, pero falta algo. Debemos configurar el quinto caracter o caracter "null". A continuacion veremos como configurar el valor de cada caracter de una cadena si es necesario. Regresamos al primer programa de cadenas y observe que lo he renombrado como "string3.c". Vamos a modificarlo para ver como utilizar asignaciones de caracteres individuales dentro de una cadena. La funcion "strcpy" asigna las letras "M", "a", "r" y "k" a la variable "name" en una sentencia. Veamos como hacerlo explicitamente, caracter por caracter. No creo que usted tenga que hacerlo de esta manera muy a menudo. porque casi todos utilizan la funcion "strcpy". Sin embargo, debemos saber como asignar valores a elementos individuales de los arreglos y no solo a las cadenas. Esta no es una parte muy importante del C, asi que veremos un ejemplo sencillo como el de la funcion "strcpy". Primero vamos a eliminar esta funcion "strcpy". Luego vamos a asignar el primer caracter que es la letra "M" de esta manera: escribimosÉ "name = M" y un punto y coma. El punto y coma y el signo de igualdad son un estandar, pero el resto puede ser un poco confuso. Para referenciar un elemento individual de cualquier arreglo y no una cadena, utilizamos corchetes como hicimos al declarar un arreglo. El cero se refiere al primer elemento del arreglo. Esto puede parecerle extrano si usted programa en lenguajes como el Basic, el FortranÉ o incluso el Pascal en donde los indices de los arreglos comienzan en 1. Tal vez piense que el primer elemento del arreglo "name" debe ser "name" y no "name". Podriamos tener los elementos "name", "name", "name", "name", etc. hasta "name" en este caso. En el lenguaje C esto no funciona asi y esta es una de las primeras normas que debemos aprender. El C difiere de otros lenguajes en que los arreglos comienzan en 0. Por lo tanto, no llegariamos al elemento 21 sino hasta el 20. Vamos a resumir: digamos que tenemos la cantidad "N" de elementos individuales de un arreglo. Estos no van desde 1 hasta "N" sino desde 0 hasta "N - 1", como desde 0 hasta 99 si tenemos 100 caracteres. El arreglo "name" contiene caracteres y su primer elemento es un solo caracter. Los caracteres siempre se denotan con comillas sencillas y las cadenas con comillas dobles. Por lo tanto, esta linea esta completa. Vamos a construir las demas. Escribimos "name = a", "name = r", "name = k" y un punto y coma. Pero aun no hemos terminado. Como ejercicio, quiero que copie exactamente este codigo y que lo compileÉ para ver el contenido de "name" al ejecutarlo. Despliegue la variable "name" utilizando el codigo "%s" y observe si el resultado es el esperado. Este es un ejemplo de la necesidad del caracter de finalizacion "null" que vamos a incluir ahora. Finalmente escribimos "name", el signo de igualdad y a continuacion designamos el caracter de terminacion "null" asi: ingresamos una barra diagonal invertida, un cero y un punto y coma. Aunque parecen 2 caracteres, este es solo 1, pues el caracter despues de la barra se toma como uno solo. Ahora la cadena esta completa. Tambien podemos representar el caracter "null"É ingresando solo el numero 0, pero no es conveniente porque se confunde con un valor entero. Aunque lo es y funciona como un entero, es mas legible de esta maneraÉ porque al asignar valores identificamos un caracter y no un entero. Tecnicamente son iguales por razones que no veremos ahora. Tal vez se pregunte: Àque pasa con los otros caracteres del arregloÉ como el quinto, el sexto y hasta el veintiunavo caracter? ÀQue valores se les ha asignado? Si no les hemos asignado nada, Àque valores contienen? Estos contiene partes aleatorias de memoria y pueden tener cualquier caracter. Pueden contener valores sin sentido, pero no nos preocupamos por ellos porque no hacen parte de la ecuacion. Cuando la funcion "printf" despliega la cadena mediante el codigo "%s", toma las letras "M", "a", "r" y "k"É y observe que tenemos un caracter alterno en el siguiente punto. Ese es el final de la cadena, asi que los otros 15 o 16 caracteres restantesÉ despues de la "k" y del caracter "null" son ignorados. Con esto concluimos la leccion de asignacion de caracteres individuales a partes individuales de una cadena. Obviamente, podriamos asignarlos en desorden y comenzar en el cuarto elemento hasta llegar al 0. Por supuesto debemos verificar si funciona. Compilamos, no obtenemos errores y ejecutamos el programa. Obtenemos "The contents of name are Mark" como antes. Excelente. Como mencione, las cadenas son parte de la gran familia de operadores del C conocidos como arreglos. Veremos los arreglos en un capitulo posterior.

Tutorial Information

Course: C Programming (Español)
Author: Mark Virtue
SKU: 33759
ISBN: 1-933736-81-X
Release Date: 2007-04-16
Duration: 21.5 hrs / 139 lessons
Captions: Available on CD and Online University
Compatibility: Vista/XP/2000, OS X, Linux
QuickTime 7, Flash 8

VTC Sign up & Benefits

  • Unlimited Access
  • 81,350 Video Tutorials (20,800 free)
  • Video Available as Flash or QuickTime
  • Over 782 Courses
  • $30 for One Month Access
  • Multi-User Discounts Available