Академический Документы
Профессиональный Документы
Культура Документы
65
Captulo 14
CADENAS
EJEMPLO 14.1
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
#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
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
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
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
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
{
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