Anda di halaman 1dari 24

PRACTICA #8 CADENAS DE CARACTERES

Las cadenas de caracteres se definen como un arreglo de datos de tipo caracter el cual termina con el carcter nulo. Un arreglo es un grupo de datos homogeneos y finitos que ocupan posiciones consecutivas de memoria. La declaracin de una cadena de caracteres se hace de la siguiente forma: char Nombre_de_la_variable [longitud de la cadena]; Esto hace que se guarde un espacio en memoria suficiente para soportar el numero de caracteres que se estan apartando para la cadena de caracteres que se va a leer. Por ejemplo: char cadena[10]; crea un espacio en memoria para 10 bytes cada uno de los cuales sera ocupado por uno de los caracteres que se van a leer. Lectura de una cadena de caracteres: Para hacer la lectura de una cadena de caracteres se pueden utilizar la funcin scanf o gets de la siguiente forma: scanf("%s",cadena); o gets(cadena); La ventaja de utilizar el gets en lugar del scanf es la lectura de los espacios en blanco, cosa que no hace el scanf. Otra forma de leer una cadena de caracteres es hacerlo caracter por caracter como un arreglo unidimensional o vector, manejandola posicion por posicion cadena[posicion], mas adelante se vera un ejemplo de lo antes mencionado. Ejemplos:
/* MANIPULACION DE UNA CADENA DE CARACTERES MANEJANDOLA COMO UN ARREGLO DE CARCTERES */ #include<conio.h> #include<stdio.h> POSICION POR POSICION,

void main(void) { char cadena[25]; int pos; clrscr(); //Lectura de la cadena de caracteres. gotoxy(20,1); printf("Teclea una cadena de maximo 25 caracteres"); gotoxy(27,2); printf("[ ]"); gotoxy(28,2);

gets(cadena);

//Impresin de la cadena caracter por caracter

clrscr();

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

{gotoxy(pos+1,pos+1);

textcolor(pos+1);

cprintf("%c",cadena[pos]);

getch();

#include <conio.h>

#include

<string.h>

#include <dos.h>

#include <stdio.h>

void main(void)

char cadena[80];

int x=0,pos,y,yy,incre=0;

clrscr();

printf("Teclea una cadena de maximo 80 caracteres\n");

gets(cadena);

textbackground(BLACK);

clrscr();

x=(80-strlen(cadena))/2;

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

y=x;

for(yy=14;yy<25;yy++)

{gotoxy(y,yy);

textcolor(pos+1);

cprintf("%c",cadena[pos]);

sound(2000+incre);

incre+=10;

delay(20);

y++;

x+=1;

x=(80-strlen(cadena))/2;

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

{ y=x;

for(yy=13;yy>=1;yy--)

{gotoxy(y,yy);

textcolor(pos+1);

cprintf("%c",cadena[pos]);

sound(2000+incre);

incre-=10;

delay(20);

y++;

x+=1;

nosound();

getch();

Impresin de una cadena de caracteres: Para imprimir una cadena de caracteres se puede utilizar la funcin puts o la funcin printf, como se indica a continuacin: puts(cadena); printf("%s",cadena);

la diferencia entre la funcion printf y puts para cadenas de caracteres es que la funcion puts cambia de linea por si sola y la funcion printf no, la ventaja de la funcion printf es que con ella si se pueden desplegar varias cadenas. Al igual que para leer una cadena tambien se puede desplegar una cadena como un arreglo, es decir posicion por posicion, esto tambien se manejara en un ejemplo mas adelante. Ejemplos: #include <conio.h> #include <stdio.h> void main() { char cadena[80]; printf(Teclea la cadena); gets(cadena); clrscr(); puts(cadena); getch();

} Funciones de cadenas de caracteres: Las funciones de cadenas de caracteres que se manejaran en la practica son las siguientes: funcin strlen, funcin strcpy, funcin strcat y funcin stricmp, todas las funciones de cadenas de caracteres funcionan con la biblioteca string.h, por lo que debera incluirla en la seccin de bibliotecas. Funcin strlen: Esta funcin regresa la longitud de una cadena de caracteres. Sintaxis: strlen(cadena); El valor que regresa es un valor de tipo entero. Ejemplo: El siguiente programa lee una cadena de caracteres e imprime por medio de la funcin strlen el numero de caracteres que tecleaste. #include <string.h> #include <stdio.h>

#include <conio.h> void main(void) { char cadena[80]; clrscr(); printf("Teclea una cadena de maximo 80 caracteres "); gets(cadena); printf("La longitud de la cadena que tecleaste es de %d",strlen(cadena)); getch(); } Funcin strcpy. Esta funcin copia a una cadena otra cadena de caracteres. Sintaxis: strcpy(cadena1, cadena2); donde cadena1 deber tener una longitud de cadena suficiente para soportar a la cadena2.

Ejemplo: El siguiente programa, lee una temperatura en F y manda un mensaje de acuerdo a la temperatura, el mensaje se copia en una variable y esta solo se imprime al final. #include <conio.h> #include <stdio.h> #include <string.h> void main(void) { char mensaje[40]; float temp; clrscr(); printf("Cual fue la temperatura promedio en F el dia de hoy"); scanf("%f",&temp);

if (temp<= 60) strcpy(mensaje,"CASI NOS CONGELAMOS"); else if(temp<=80)

strcpy(mensaje,"GENIAL PARA DIA DE CAMPO "); else if (temp<=100)

strcpy(mensaje,"PARA PASARSELA EN LA ALBERCA"); else

strcpy(mensaje,"COMO PARA ESTAR EN EL CONGELADOR ");

puts(mensaje); getch();

} Funcin strcat. Esta funcin agrega al final de una cadena de carcteres otra cadena de caracteres. Sintaxis: strcat(cadena1, cadena2); donde al final de la cadena 1 se agregara la cadena 2. Ejemplo: #include <conio.h> #include <stdio.h> #include <string.h> void main() { char

cadena[80]; clrscr(); printf(Teclea una cadena); gets(cadena); strcat(cadena,Agrega al final); puts(cadena); getch(); }

Funcin strimp. Esta funcin compara 2 cadenas de caracteres lexicograficamente hablando, (alfabeticamente), y regresa un valor entero de acuerdo a la comparacin. Sintaxis: stricmp(cadena1,cadena2) Comparacin Valor que regresa Cadena1=Cadena2 =0

Cadena1>Cadena2 >0 Cadena1<Cadena2 <0 si se tiene la cadena "Azul" y la cadena "Rojo", La cadena Azul sera menor que la cadena"Rojo", ya que la primera inicia con A y la segunda con R. Ejemplo:
/* EL SIGUIENTE PROGRAMA LEE UNA CADENA DE CARACTERES Y NO LA MUESTRA

EN PANTALLA SOLO SI TECLEA LA PALABRA CLAVE QUE EN ESTE CASO ES

TURBO C */

#include <conio.h>

#include <stdio.h>

#include <string.h>

void main(void)

char cadena[80]=" ";

int pos=0;

clrscr();

printf("Teclea una cadena de caracteres \n");

for(;;)

cadena[pos]=getch();

if (cadena[pos]==13)

pos--;

break;

else

pos++;

putch('*');

if(stricmp(cadena,"TURBO C\r")==0)

puts(cadena);

else

puts("No tecleaste la clave");

getch();

DESARROLLO DE LA PRACTICA. PRAC8A.C HACER UN PROGRAMA QUE LEA UNA CADENA DE MAXIMO 80 CARACTERES Y CAMBIE LAS LETRAS MAYUSCULAS POR MINUSCULAS Y LAS LETRAS MINUSCULAS POR MAYUSCULAS. (Utilizar la funcin toupper,convierte las minusculas a mayusculas y la funcion tolower que convierte de mayusculas a minusculas). Por ejemplo, si teclea la cadena "Laboratorio De Programacin" deber aparecer en pantalla: lABORATORIO dE pROGRAMACION PRAC8B.C

HACER UN PROGRAMA QUE LEA UNA CADENA DE CARACTERES Y LA IMPRIMA EN EL CENTRO DE LA PANTALLA DE MANERA VERTICAL. (Utilizar la funcin strlen) PRACT8C.C HACER UN PROGRAMA QUE PIDA EL NOMBRE DEL MES Y DIA DEL AO EN QUE NACIO UNA PERSONA E IMPRIMA EL SIGNO DEL SODIACO QUE LE CORRESPONDE. ARIES DEL 20 DE MARZO AL 18 DE ABRIL

TAURO DEL 19 DE ABRIL AL 19 DE MAYO

GEMINIS DEL 20 DE MAYO AL 20 DE JUNIO

CANCER DEL 21 DE JUNIO AL 21 DE JULIO

LEO DEL 22 DE JULIO AL 21 DE AGOSTO

VIRGO DEL 22 AGOSTO AL 21 DE SEPTIEMBRE

LIBRA DEL 22 DE SEPTIEMBRE AL 22 OCTUBRE

ESCORPION DEL 23 DE OCTUBRE AL 20 DE NOVIEMBRE

SAGITARIO DEL 21 DE NOVIEMBRE AL 20 DE DICIEMBRE

CAPRICORNIO DEL 21 DE DICIEMBRE AL 19 DE ENERO

ACUARIO DEL 20 DE ENERO AL 18 DE FEBRERO

PISCIS DEL 19 DE FEBRERO AL 19 DE MARZO

(Utilizar la funcin strcpy y stricmp)

PRACT7D.C

HACER UN PROGRAMA QUE REALIZE UN EXAMEN DE INGLES DONDE LA PERSONA TENGA QUE TECLEAR LAS SIGUIENTES RESPUESTAS:

PREGUNTA #1. COMO SE ESCRIBE EN INGLES COMO ESTAS?

PREGUNTA #2. COMO SE ESCRIBE EN INGLES CUANTOS AOS TIENES?

PREGUNTA #3. COMO SE ESCRIBE EN INGLES "NO TE PREOCUPES"

PREGUNTA #4. COMO SE ESCRIBE EN INGLES EN DONDE VIVES?

PREGUNTA #5. COMO SE ESCRIBE EN INGLES "TE LLAMO DESPUES"

EL PROGRAMA DEBERA TERMINAR SI LA PERSONA TECLEA TODAS LAS RESPUESTAS CORRECTAS O DESPUES DE 2 INTENTOS.

ADEMAS AL INICIAR DEBERA PREGUNTAR EL NOMBRE DE LA PERSONA QUE VA A HACER EL EXAMEN, AGREGANDO AL FINAL DEL NOMBRE UN MENSAJE QUE INDIQUE SI LO LOGRO AL PRIMER INTENTO, AL SEGUNDO O SI NO LO LOGRO.

(Utilizar las funciones stricmp y strcat).

Cadena de caracteres.Una cadena en C++ es un conjunto de caracteres, o valores de tipo "char", terminados con el carcter nulo. Internamente se almacenan en posiciones consecutivas de memoria en forma de arreglo. Contenido
[ocultar]

1 Estructura o 1.1 Uso de strcpy o 1.2 Uso de strcnpy 2 Fuentes 3 Referencias 4 Bibliografa 5 Enlaces externos

Estructura
Este tipo de estructuras recibe un tratamiento especial, y es de gran utilidad y de uso continuo. La manera de definir una cadena es la siguiente: char <identificador> [<longitud mxima>]; Cuando se declara una cadena hay que tener en cuenta que tendremos que reservar una posicin para almacenar el carcter nulo, de modo que si queremos almacenar la cadena "HOLA", tendremos que declarar la cadena como: char Saludo[5]; Cuatro caracteres para "HOLA" y uno extra para el carcter '\000'. Tambin nos ser posible hacer referencia a cada uno de los caracteres individuales que componen la cadena, simplemente indicando la posicin. Por ejemplo el tercer carcter de nuestra cadena de ejemplo ser la 'L', podemos hacer referencia a l como Saludo[2]. Los ndices tomarn valores empezando en el cero, as el primer carcter de nuestra cadena sera Saludo[0], que es la 'H'. Una cadena puede almacenar informaciones como nombres de personas, mensajes de error, nmeros de telfono, etc. El tratamiento de las cadenas de caracteres resulta muy importante, debido a la gran cantidad de

informacin que ellas almacenan y su valor semntico. Algunas de las operaciones ms importantes con cadenas, son:

Copia de una cadena Clculo de la longitud, Comparacin, Concatenacin, Extraccin de subcadenas, Bsqueda de informacin dentro de las cadenas, Conversiones

Que se muestran a continuacin, segn las contenidas en la biblioteca llamada string (string.h). Copia de cadenas Esta operacin brinda la posibilidad de copiar el valor de una cadena para una variable de cadena dada. Con stpcpy(var_cadena, cadena2) se copia el valor de cadena2 para var_cadena. Ejemplo: El siguiente programa muestra la copia de la cadena frase1 a la cadena frase2.

Uso de strcpy
#include <iostream.h> #include <string.h> void main() { char frase1[] = "Copiando cadena"; char frase2[80]; strcpy(frase2,frase1); cout << "Cadena # 1: " << frase1 << endl; cout << "Cadena # 2: " << frase2 << endl; } Si la cadena fuente es de longitud mayor que la cadena destino, se cae en el gravsimo error de sobrescribir despus del final de la cadena fuente. Una variante de esta funcin y que ayuda a eliminar el efecto colateral arriba expresado es utilizar la funcin strncpy, stpncpy(var_cadena, cadena2, cantidad) que posee un tercer parmetro (cantidad) para indicar cuntos

caracteres sern transferidos. Una vez transferidos los caracteres, debe escribirse en la cadena destino el carcter null.

Uso de strcnpy
#include <iostream.h> #include <string.h> void main(void) { char destino[10]; char origen[] = "abcdefghi"; strncpy(destino, origen, 3); destino[3] = '\0'; //Si esto no se hace, la salida es imprevisible cout << destino<< '\n'; } La salida sera: abc Es bueno destacar que si una cadena se define con un constructor corriente de arreglo, como en: char cadena[6]; no resultara posible hacer: cadena = "casa"; // ERROR

pues, como sabemos, no es posible aplicar el operador de asignacin para arreglos completos. Entonces usaramos: strcpy(cadena, "casa"); lo cual es mejor que la solucin de copiar de una cadena para otra carcter a carcter: for(i = 0; i < strlen(cadena2); i++) var_cadena[i] = cadena2[i]; var_cadena[i] = '\0'; // carcter nulo de terminacin

Cmo comparo cadenas de caracteres en C++?


Bueno, lo que quiero hacer en realidad es esto: Tengo una variable n, y quiero que el programa pida ingresar un color, por ejemplo "negro", ahora quiero que reconozca el color y le d un determinado valor a n. Por ejemplo, si el usuario escribe "negro" n valdr 1, para eso debo hacer una comparacin, algo como, "si el carcter es igual a "negro", entonces... Cmo hago esa comparacin? Adems, alguien podra aclararme como declaro la cadena de caracteres? Yo lo hice de esta forma: char ne[5]= "negro"; Pero no estoy seguro de qu es el nmero entre corchetes y si "ne" podr utilizarlo para hacer la comparacin despus. Nota: Uso DEV C++

hace 3 aos Reportar abusos

Ivan_San...

Mejor respuesta - elegida por quien pregunt


La cadena la puedes declarar de muchas formas, como tu no sabes que color van a escribir en tu cadena en realidad no sabes que tamao debe de tener tu cadena (el numero entre los corchetes) por lo que no es una buena idea darle un tamao tan reducido. Entonces declaramos con un espacio suficiente: char cadena[20]; //Aqu declare una cadena que puede almacenar 20 caracteres Luego lees la entrada de forma comn:

cout << "Introduce un color: "; cin >> cadena; //Aqu ya se almaceno el color en la cadena Convertimos la cadena a mayusculas para que puedas reconocer casos generales; por ejemplo si alguien escribe Negro, negro, nEgro, NEGRO, neGro, neGRO, etc lo convertimos a mayusculas para que no importa como escriban negro, siempre termine en mayusculas y no tengamos que hacer tantas comparaciones. Esto lo hacemos con la funcin toupper() que se encuentra en el archivo de cabecera "ctype". Toupper slo convierte 1 caracter no una cadena entera, as que tenemos que recorrer la cadena caracter por caracter. int i = 0; while(cadena[i] != \0) //Mientras que no encontremos el fin de cadena { cadena[i] = toupper(cadena[i]); //Convertimos a mayusculas cada caracter i++; } Luego podras usar la funcin strcmp(), que se encuentra en el archivo de cabecera "cstring", as: if(strcmp("NEGRO", cadena) == 0) //Si la cadena contiene la palabra NEGRO n = 1; else if(strcmp("BLANCO", cadena) == 0) n = 2; Y as con todos los colores que ocupes. Y recuerda incluir los archivos de cabecera ctype y cstring, as: #include <ctype> #include <cstring>

Otra cosa, los 2 comentarios anteriores que te dieron no estan en C++, sino en C; y el ultimo comentario slo funcionara en turbo c, no en Dev-C porque usa archivos de cabecera privativos de borland. Mejor no les hagas caso a esos comentarios que te pusieron. Y lo que menciona Uriel sobre la clase string es muy cierto XD, tu decides. Saludos.