Documente Academic
Documente Profesional
Documente Cultură
SESION 10
Libreras Estandar string.h
Punteros Arrays dinmicos
ACTIVIDADES
strlen devuelve el nmero de caracteres que hay en s, excluyendo el carcter nulo de terminacin
de cadena.
Copia la cadena orig a dest, la copia de caracteres se detendr cuando sea copiado el carcter
nulo.
Compara las dos cadenas, si la cad1 es mayor que cad2 el resultado ser mayor de 0, si cad1 es
menor que cad2, el resultado ser menor de 0, si son iguales, el resultado ser 0. La
comparacin se realiza carcter a carcter. Mientras los caracteres comparados sean iguales, se
contina con el siguiente carcter. Cuando se encuentran caracteres distintos, aqul que tenga un
cdigo ASCII menor pertenecer a la cadena menor. Por supuesto, si las cadenas son iguales
hasta que una de ellas se acaba, la ms corta es la menor.
#include <iostream.h>
#include <string.h>
int main() {
char *cadena1 = "Cadena ejemplo 1";
char *cadena2 = "Cadena ejemplo 2";
char *cadena3 = "Cadena";
char *cadena4 = "Cadena";
Aade o concatena una cadena a otra. "strcat" aade una copia de orig al final de dest. La
longitud de la cadena resultante ser strlen(dest) + strlen(orig).
#include <iostream.h>
#include <string.h>
int main() {
char *cadena1 = "Cadena de";
char *cadena2 = " ejemplo";
char cadena3[126];
strcpy(cadena3, cadena1);
cout << strcat(cadena3, cadena2) << endl;
return 0;
}
Sintaxis:
Copia maxlong caracteres de la cadena orig a dest, si hay ms caracteres se ignoran, si hay
menos se rellenar con caracteres nulos. La cadena dest no se terminar con nulo si la longitud
de orig es maxlong o ms.
#include <iostream.h>
#include <string.h>
int main() {
char *cadena = "Cadena ejemplo";
char cad[32];
strncpy(cad, cadena, 4);
cad[4] = '\0';
cout << cad << endl;
return 0;
}
Compara las dos cadenas igual que strcmp, pero slo se comparan los primeros maxlong
caracteres.
#include <iostream.h>
#include <string.h>
int main() {
char *cadena1 = "Cadena ejemplo 1";
char *cadena2 = "Cadena ejemplo 2";
char *cadena3 = "Cadena";
char *cadena4 = "Cadena";
if(strncmp(cadena1, cadena2, 6) < 0)
cout << cadena1 << " es menor que " << cadena2 << endl;
else if(strncmp(cadena1, cadena2, 6) > 0)
cout << cadena1 << " es menor que " << cadena2 << endl;
else
cout << cadena1 << " es igual que " << cadena2 << endl;
"strncat" aade como mximo maxlong caracteres de la cadena orig al final de dest, y despus
aade el carcter nulo. La longitud de la cadena resultante ser strlen(dest) + maxlong.
#include <iostream.h>
#include <string.h>
int main() {
char *cadena1 = "Cadena de";
char *cadena2 = " ejemplo";
char cadena3[126];
strcpy(cadena3, cadena1);
cout << strncat(cadena3, cadena2, 5) << endl;
return 0;
}
Ya hemos visto que los arrays pueden ser una potente herramienta para el almacenamiento y
tratamiento de informacin, pero tienen un inconveniente: hay que definir su tamao durante el
diseo del programa, y despus no puede ser modificado.
La gran similitud de comportamiento de los punteros y los arrays nos permiten crear arrays
durante la ejecucin, y en este caso adems el tamao puede ser variable.
Para ello se usan los punteros a punteros, y los arrays construidos de este modo se denominan
arrays dinmicos.
int **tabla;
Sabemos que un puntero se comporta casi igual que un array, por lo tanto nada nos impide que
"tabla" apunte al primer elemento de un array de punteros:
int n = 134;
tabla = new int*[n];
Ahora estamos en un caso similar, "tabla" apunta a un array de punteros a int, cada elemento de
este array puede ser a su vez un puntero al primer elemento de otro array:
int m = 231;
for(int i = 0; i < n; i++)
tabla[i] = new int[m];
Ahora tabla apunta a un array de dos dimensiones de n * m, podemos acceder a cada elemento
igual que accedemos a los elementos de los arrays normales:
tabla[21][33] = 123;
Antes de abandonar el programa hay que liberar la memoria dinmica usada, primero la asociada
a cada uno de los punteros de "tabla[i]":
delete[] tabla;
#include <iostream.h>
int main() {
int **tabla;
int n = 134;
int m = 231;
int i;
// Array de punteros a int:
tabla = new int*[n];
// n arrays de m ints
for(i = 0; i < n; i++)
tabla[i] = new int[m];
tabla[21][33] = 123;
cout << tabla[21][33] << endl;
// Liberar memoria:
for(i = 0; i < n; i++) delete[] tabla[i];
delete[] tabla;
return 0;
}
9. Realizar un programa que permita crear un array de [10] [20], en cada posicin del array
debe almacenar el producto de la fila x la columna donde se encuentre el elemento.
10. Veamos ahora un ejercicio donde tendremos un array dinmico que varie su tamao en cada
segn la cantidad de elementos que contenga en cada columna.
#include <iostream.h>
#define NCIUDADES 5
#define CIUDAD_A 0
#define CIUDAD_B 1
#define CIUDAD_C 2
#define CIUDAD_D 3
#define CIUDAD_E 4
// Inicializacin:
tabla[CIUDAD_A][CIUDAD_B-CIUDAD_A-1] = 154;
tabla[CIUDAD_A][CIUDAD_C-CIUDAD_A-1] = 245;
tabla[CIUDAD_A][CIUDAD_D-CIUDAD_A-1] = 54;
tabla[CIUDAD_A][CIUDAD_E-CIUDAD_A-1] = 452;
tabla[CIUDAD_B][CIUDAD_C-CIUDAD_B-1] = 354;
tabla[CIUDAD_B][CIUDAD_D-CIUDAD_B-1] = 125;
tabla[CIUDAD_B][CIUDAD_E-CIUDAD_B-1] = 133;
tabla[CIUDAD_C][CIUDAD_D-CIUDAD_C-1] = 152;
tabla[CIUDAD_C][CIUDAD_E-CIUDAD_C-1] = 232;
tabla[CIUDAD_D][CIUDAD_E-CIUDAD_D-1] = 110;
// Ejemplos:
cout << "Distancia A-D: " << Distancia(CIUDAD_A, CIUDAD_D) <<
endl;
cout << "Distancia B-E: " << Distancia(CIUDAD_B, CIUDAD_E) <<
endl;
cout << "Distancia D-A: " << Distancia(CIUDAD_D, CIUDAD_A) <<
endl;
cout << "Distancia B-B: " << Distancia(CIUDAD_B, CIUDAD_B) <<
endl;
cout << "Distancia E-D: " << Distancia(CIUDAD_E, CIUDAD_D) <<
endl;
Efectivamente, para este ejemplo se complica el acceso a los elementos de la tabla ya que
tenemos que realizar operaciones para acceder a la segunda coordenada. Sin embargo piensa en
el ahorro de memoria que supone cuando se usan muchas ciudades, por ejemplo, para 100
ciudades: