Cadenas de texto en C

Una cadena de texto en “C” es un array de caracteres. Como a todo array, se le puede reservar espacio estáticamente o dinámicamente:

Estáticamente: char texto[80];

Dinámicamente: char *texto; reservando espacio con “malloc” cuando nos haga falta. De todas formas una cadena de caracteres siempre terminará con un carácter nulo ()

Es decir:

Si necesitamos 7 letras para un teléfono:

char telefono[8];
7 letras del teléfono +

Para copiar el valor de una cadena de texto en otra, no podemos hacer: texto1 = texto2, porque estaríamos igualando dos punteros. En vez de eso, debemos usar una función de biblioteca: strcpy que se encuentra en string.h

Strcpy(destino, origen);

El problema está en que en la cadena destino haya suficiente espacio reservado para copiar lo que queremos:

– Si queremos copiar sólo los primeros “n” bytes de origen, usamos:

strncpy(destino,origen,n);

– Para añadir una cadena al final de otra (concatenarla), usamos:

strcat(origen,destino);

– Para comparar dos cadenas alfabéticamente (para ver si son iguales o para ordenarlas, por ejemplo), usamos: trcmp(cad1,cad2);

= 0 si las cadenas son iguales.
<0 si cad1<cad2
>0 si cad1>cad2

-Según el compilador tenemos: strupr(cadena); que convierte la cadena a mayúsculas

– Prog113

/* Prog113.cpp */

/* Cadenas de texto */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char texto1[80]=»Hola»;  /* Cadena Estática */
char *texto2;                       /* Cadena Dinámica */
void main()
{
/* Reservo espacio para la cadena dinámica
*/ texto2=(char *) malloc (70*sizeof(char));
strcpy(texto2,»Adios»); /* Le doy un valor */
puts(texto1);
puts(texto2); /* Escribo las dos */
strncpy(texto1,texto2,3); /* copio las 3
primeras
letras */
puts(texto1);
strcat(texto1,texto2); /* añado text2 al final */
puts(texto1);
printf(«Si las comparamos obtenemos: %d»,strcmp(texto1,texto2)); printf(«(Numero negativo: texto1 es menor) n»);
printf(«La longitud de la primera es %d n», strlen(texto1));
printf(«En mayúsculas es %s n»,strupr(texto1)); free(texto2);
}

– Prog114

/* Prog114.cpp */

/* Programa que analiza lo que escribimos: dígitos numéricos o caracteres alfabéticos. */

#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <conio.h>

int menu();
/* función que hace aparecer un menú con dos opciones: 1: sólo números, 2: sólo letras. Devuelve 1 o 2 */
int numeros();
/* función que lee dígitos numéricos en forma de caracteres y devuelve el valor en entero. */
void captura(char palabra[]);

/* función que lee en forma de caracteres y analiza si son letras */

void main()
{
int cifra;
char word[20];
clrscr();
switch(menu())
{
case 1: cifra=numeros();
printf(«n%d»,cifra); break;
case 2: captura(word);
printf(«n%s»,word);
break;
default: exit(0);
}
getch();
}
void captura(char palabra[])
{
char *letra;
char alfabeto[]=»ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz»; int i;
palabra[0]=»;
clrscr(); do
{
*letra=getch();
for (i=0;i<=53;i++)
{
if (alfabeto[i]==*letra)
{
printf(«%c»,*letra);
strcat(palabra,letra);
/* la función «strcat» añade «letra» a «palabra» y añade al final el caracter nulo. Se encuentra en <string.h> */
break;
}
}
}while((*letra!=13) && (strlen(palabra)<20));
}
int numeros()
{
char cadena[10];
char car=»;
int i=0;
int cantidad;
do
{
car=getch();
switch(car)
{
case’0′: cadena[i]=car;
printf(«%c»,car); break;
case’1′: cadena[i]=car;
printf(«%c»,car);break;
case’2′: cadena[i]=car;
printf(«%c»,car);break;
case’3′: cadena[i]=car;
printf(«%c»,car);break;
case’4′: cadena[i]=car;
printf(«%c»,car);break;
case’5′: cadena[i]=car;
printf(«%c»,car);break;
case’6′: cadena[i]=car;
printf(«%c»,car);break;
case’7′: cadena[i]=car;
printf(«%c»,car);break;
case’8′: cadena[i]=car;
printf(«%c»,car);break;
case’9′: cadena[i]=car;
printf(«%c»,car);break;
default: i–; break;
}
i++;
}while((car!=13) && (i<5)); cantidad=atoi(cadena);
/* la función «atoi» devuelve el número entero correspondiente
a «cadena». Se encuentra en <stdlib.h> */
return(cantidad);
}
int menu()
{
int numero;
printf(«Escoge una opción:n»);
printf(«1. Escribir sólo númerosn»);
printf(«2. Escribir únicamente letrasn»); printf(«Opción: «);
scanf(» %d»,&numero); return(numero);
}

– Prog115

/* Prog115.cpp */

/* Programa que demuestra el procedimiento copia el cual, copia una cadena en otra*/

#include<string.h>
#include <conio.h>
#include<stdio.h>
char *copia(char *cad1,char *cad2);
void main()
{
char palabra1[10];
char palabra2[10];
char palabra3[20];
printf(«palabra1= «); scanf(«%s»,palabra1); printf(«palabra2= «); scanf(«%s»,palabra2); copia(palabra2,palabra1); printf(«palabra1+palabra2= %s»,palabra1); getch();
}
char *copia(char *cad1, char *cad2)
{
char *inicio; int i; inicio=cad2;
while(*cad2!=»)
cad2++;
while(*cad1!=»)
{
*cad2=*cad1;
cad2++;
cad1++;
}
*cad2=»;
cad2=inicio;
}

Fuente: Programación en C/C++ (Manual FV) de Fermí Vilà