Вы находитесь на странице: 1из 10

Cadenas

65

Captulo 14
CADENAS
EJEMPLO 14.1

static char cadena [] = "Cadena esttica";


char *cadena2;
cadena2 = (char*) malloc (strlen(cadena) + 1);
strcpy (cadena2, cadena);
EJEMPLO 14.2

char entrada[40];
char *ptrchar;
printf ("Introduzca una cadena de caracteres: ");
ptrchar = gets (entrada);
printf ("\n Esta es la cadena introducida: ");
for (; *ptrchar != '\0'; ptrchar++)
putchar (*ptrchar);
puts ("\n Presione una tecla para terminar");
getch ();
EJEMPLO 14.3

66

Programacin en C. Algoritmos, estructuras de datos y objetos

#include <stdio.h>
#include <string.h>
void main()
{
char cad[81], *a;
int i, n;
puts ("Introduce lneas, separando las palabras con blancos.\n ");
a = gets (cad);
while (a != NULL)
{
n = 0;
for (i = 0; i < strlen(cad); i++)
if (cad[i] == ' ') n++;
/* tambin se accede a los char con *(cad+i) */
if (i > 0) ++n;
printf ("Nmero de palabras: %d \n", n);
a = gets (cad);
}
}

Ejemplo 14.4

char *c = " -49 2332";


char **pc = (char**) malloc(1);
long n1;
unsigned long n2;
n1 = strtol (c,pc,0);
printf (" n1 = %ld\n", n1);
printf (" cadena actual %s\n", *pc);
c = *pc;
n2 = strtoul (c, pc, 10);
printf (" n2 = %lu", n2) ;
Ejemplo 14.5
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
void main (void)
{
char*c = "333.55553 444444.2 3e+1221";
char **a;

Cadenas

double v=0 ;
a = (char**) malloc(1);
v = strtod (c, a);
if (errno != 0)
{
printf ("Error \"%d\" al convertir la cadena.", errno);
exit (-1);
}
printf ("c = [%s], v = %lf\n", c, v);
while ((**a) != '\0')
{
c = *a;
v = strtod (c, a);
if (errno != 0)
{
printf ("Error \"%d\" al convertir la cadena.", errno);
exit(-1);
}
printf("c = [%s], v = %lf\n", c, v);
}
}
EJERCICIOS
14.1
strcpy (cd, Asigna cadena);
14.2
int i;
char asignatura [N][20], codigo [N][6];
for (i = 0; i<= N; i++)
{
printf ("\n\tEscriba el nombre de la asignatura: ");
gets (asignatura [i]);
printf ("\n\tEscriba el cdigo de la asignatura: ");
gets (codigo [i]);
}

14.3

67

68

Programacin en C. Algoritmos, estructuras de datos y objetos

scanf( ) limita las variables que reconoce en la entrada por medio de los espacio en blanco que
las separan, por lo tanto no es capaz de reconocer una lnea que contenga espacios en blanco,
porque para esta funcin cada palabra es una cadena diferente. Por lo tanto si queremos leer una
cadena de caracteres que contenga espacios en blanco ha de hacerse con gets( ). Por otro lado
gets( ) tiene el peligro de que aparentemente tiene un uso ms sencillo que scanf( ) pero si
no se le proporciona una cadena de caracteres como argumento puede que no almacene
correctamente la entrada.
14.4
leerTexto (char**texto, int nlineas)
{
int i;
char buffer [80];
texto = (char**) malloc (nlineas * sizeof (char*));
for (i=0; i < nlineas ; i++)
{
gets (buffer);
texto [i] = (char*) malloc ((strlen (buffer ) +1) * sizeof
(char));
strcpy (texto [i], buffer);
}
}

14.5
cuentaLetras ( char*
*digitos)
{
char* p = cadena;

cadena,

int

*vocales,

int

*consonantes,

int

while (*p != '\0')


{
if ((*p >= 'a' && *p <= 'Z') || ((*p >= 'a' && *p <= 'z'))
switch (*p)
{
case 'a': case 'A':
case 'e': case 'E':
case 'i': case 'I':
case 'o': case 'O':
case 'u': case 'U': (*vocales)++;
default : (*consonantes)++;
}
if (*p >= '0' && *p <= '9') (*digitos)++;
p++;
}
}

14.6
La variable c1 es un puntero que puede apuntar a un puntero a caracteres, pero no esta inicializado
con una direccin vlida. La variable c2 es un array de 10 punteros a caracteres, pero estos 10
punteros no apuntan a ningn dato vlido. La variable c3 es una matriz con espacio para 210
punteros a caracteres no inicializados accesibles segn un arreglo de 10 filas de 21 elementos cada
una de ellas.

Cadenas

69

14.7
char*gets2 ( char* cadena)
{
char c, *p = cadena;
while ((( c = getchar( )) != EOF) || (c == '\n'))
*p++ = c;
*p = '\0';
return cadena;
}

14.8
char* lee_linea(char*c, int n)
{
char ch, *cc = c;
if (( ch = getchar( )) == EOF) return (EOF);
else *cc++ = ch;
while ((( ch = getchar( )) != '\n') || (cc - c < n))
*cc++ = ch;
*cc = '\0';
return c;
}

14.9
main( )
{
char *texto[60];
int i, lmax, posmax, lmin, posmin;
char buffer [80];
for (i=0; i < 60 ; i++)
{
gets (buffer);
if ( strlen (buffer) == 0) break;
if (strlen (buffer) < lmin)
{
posmin = i;
lmin = strlen (buffer);
}
if (strlen (buffer) > lmax)
{
posmax = i;
lmax = strlen (buffer);
}
texto [i] = (char*) malloc ((strlen (buffer ) +1) * sizeof
(char));
strcpy (texto [i], buffer);
}
strcpy (buffer, texto[posmin]);
strcpy (texto[posmin], texto[posmax]);
strcpy (texto[posmax], buffer);

70

Programacin en C. Algoritmos, estructuras de datos y objetos

14.10
main( )
{
char cad[80];
char*separador = " ";
char*ptr = cad;
gets (cad);
printf("\n%s\n",cad);
ptr = strtok(cad, separador);
printf("\tSe rompe en las palabras");
while (ptr)
{
printf("\n%s",ptr);
ptr = strtok(NULL, separador);
}
}

14.11
main( )
{
char* texto[30], buffer [80], clave[15];
int i, veces, *ptr;
puts ( Introduzca la palabra clave a buscar: );
gets (clave);
for (i=0; i < 30 ; i++)
{
gets (buffer);
texto [i] = (char*) malloc ((strlen (buffer ) +1) * sizeof
(char));
strcpy (texto [i], buffer);
ptr = texto[i];
while ((ptr = strstr (ptr, clave)) != NULL) veces++;
}
printf (La palabra clave %s aparece %d veces en el texto.\n,
clave, veces);
}

14.12
main( )
{
char* texto[40], buffer [80];
int i, longlin[40][2];
puts ( Introduzca el texto lnea a lnea. \n );
for (i=0; i < 40 ; i++)
{
gets (buffer);
texto [i] = (char*) malloc ((strlen (buffer ) +1) * sizeof
(char));
strcpy (texto[i], buffer);
longlin [i][0] = strlen (buffer ) +1;
longlin [i][1] = i;

Cadenas

71

}
ordenar (longlin);
for (i=0; i < 40 ; i++)
puts (texto[ longlin[i]]);
}

14.13
main( )
{
char* texto[100], buffer [80], palabras[28][20], *ptr;
int i, j;
puts ( Introduzca el texto lnea a lnea. \n );
for (i=0; i < 100 ; i++)
{
gets (buffer);
texto [i] = (char*) malloc ((strlen (buffer ) +1) * sizeof
(char));
strcpy (texto[i], buffer);
ptr = strtok(texto[i], );
j = 0;
while (ptr)
{
strcpy (palabras [j++], ptr);
ptr = strtok(NULL, );
}
ordenar (palabras);
for (i=0; i < 28 ; i++)
{
puts ( palabras[i]);
palabras[0] = \0;
}
}
}

14.14
main( )
{
char* texto[100], buffer [80], palabras[28][20], *ptr;
int i, j;
puts ( Introduzca el texto lnea a lnea .\n );
for (i=0; i < 30 ; i++)
{
gets (buffer);
texto [i] = (char*) malloc ((strlen (buffer ) +1) * sizeof
(char));
strcpy (texto[i], buffer);
}
ordenar (texto);
for (i=0; i < 30 ; i++)
puts (buffer);
}

14.15
main( )

72

Programacin en C. Algoritmos, estructuras de datos y objetos

{
char* texto[100], buffer [80], *ptr;
int i, kilos, suma;
puts ( Introduzca el texto lnea a lnea. \n );
for (i=0; i < 100 ; i++)
{
gets (buffer);
texto [i] = (char*) malloc ((strlen (buffer ) +1) * sizeof
(char));
strcpy (texto[i], buffer);
ptr = strtok(texto[i], );
j = 0;
while (ptr)
{
if ((kilos = atoi (ptr)) != 0)
suma += kilos;
ptr = strtok(NULL, );
}
printf ("La suma total de los kg. recogidos es de %d\n", suma );
}
}

14.16
main( )
{
char *texto[50], buffer[80], clave[15];
int i;
puts ( Introduzca la palabra clave a buscar: );
gets (clave);
for (i=0; i < 50 ; i++)
{
gets (buffer);
texto [i] = (char*) malloc (strlen (buffer)+1));
if (strstr (buffer, clave) == NULL)
strcpy (texto [i], buffer);
}
}

14.17
char* leerGrandes (char* num1, char* num2)
{
/* para alinear los nmeros damos la vuelta a las cadenas
487954558
855459784
+
235869
+
968532
-----------------------488190427
724091884
as podemos sumar los dgitos en el sentido del array */
char* rnum1, * rnum2, *result;
int i, mayor;
rnum1 = strrev (num1);
rnum2 = strrev (num2);
mayor = strlen (num1) > strlen (num2) ? strlen (num1) : strlen
(num2);
result = (char*) malloc ((mayor +2) * sizeof (char));

Cadenas
for (i=0; i<=mayor; i++)
result[i] = *rnum1++ + *rnum2++;
for (i=0; i<=mayor; i++) /* clculo del arrastre */
if (result[i] > 10)
{
result[i+1] += (int) result[i] / 10;
/* divisin entera */
resutl[i] %= 10;
}
return (strrev (result));
}

14.18
main( )
{
char* texto[100], buffer [80], *ptr;
int i, j, mayor;
puts ( Introduzca el texto linea a linea.\n );
for (i=0; i < 100 ; i++)
{
gets (buffer);
texto [i] = (char*) malloc (80 * sizeof (char));
strcpy (texto[i], buffer);
if (mayor < strlen (buffer))
mayor = strlen (buffer);
}
/* rellenado con blancos */
for (i=0; i < 100 ; i++)
{
for (j= strlen (texto[i]); j <mayor; j++)
*(texto[i] + j) = ' ';
texto[i][mayor+1] = '\0';
}
}

14.19
main( )
{
char cad1[40], cad2[40];
char* ptr1 = cad1, *ptr2 = cad2;
int letras1[28], letras2[28], i;
gets (cad1);
cad1 = tolower (cad1);
gets (cad2);
cad2 = tolower (cad2);
for (i=0; i < strlen(cad1); i++)
{
if (alpha (cad1[i]))
letras1[cad1[i] - 'a']++;
if (alpha (cad1[i]))
letras1[cad1[i] - 'a']++;
}
for (i=0; i < strlen(28); i++)
if (letras1[i] != letras2[i])

73

74

Programacin en C. Algoritmos, estructuras de datos y objetos


puts ("Las cadenas introducidas no son anagramas. \n");
puts ("Las cadenas introducidas son anagramas. \n");

Вам также может понравиться