Cadenas
Capítulo 14
CADENAS
static char cadena [] = "Cadena estática";
char *cadena2;
cadena2 = (char*) malloc (strlen(cadena) + 1);
strcpy (cadena2, cadena);
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 ();
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) ;
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
void main (void)
{
char*c = "333.55553 444444.2 3e+1221";
char **a;
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 código de la asignatura: ");
gets (codigo [i]);
}
14.3
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 línea que contenga espacios en blanco, porque para esta función 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 más 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* cadena, int *vocales, int *consonantes, int *digitos)
{
char* p = cadena;
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 dirección válida. La variable c2 es un array de 10 punteros a caracteres, pero estos 10 punteros no apuntan a ningún dato válido. La variable c3 es una matriz con espacio para 210 punteros a caracteres no inicializados accesibles según un arreglo de 10 filas de 21 elementos cada una de ellas.
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);
}
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 línea a línea. \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;
}
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 línea a línea. \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 línea a línea .\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( )
{
char* texto[100], buffer [80], *ptr;
int i, kilos, suma;
puts (“ Introduzca el texto línea a línea. \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 números damos la vuelta a las cadenas
487954558 855459784
+ 235869 + 968532
------------ -------------
488190427 724091884
así podemos sumar los dígitos 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));
for (i=0; i<=mayor; i++)
result[i] = *rnum1++ + *rnum2++;
for (i=0; i<=mayor; i++) /* cálculo del arrastre */
if (result[i] > 10)
{
result[i+1] += (int) result[i] / 10;
/* división 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])
puts ("Las cadenas introducidas no son anagramas. \n");
puts ("Las cadenas introducidas son anagramas. \n");
}
VULNERABILIDAD DE LAS CADENAS DE ABASTOS DE ALIMENTO EN
Tags: cadenas 329, ("las cadenas, cadenas, static, capítulo, ejemplo