1stLabC
Ejercicios
- MiFuncion
- Eco
Ejercicio 1¶
- Reorganizar los fuentes del segundo ejemplo para que el c贸digo de MiFuncion()聽est茅 en un archivo fuente adicional, separado de ejPrintf.c y denominado MiFuncion.c
- La soluci贸n no requiere programaci贸n alguna sino 煤nicamente reorganizar el c贸digo en 2 archivos fuente (ejPrintf.c, MiFuncion.c) y un archivo cabecera (ejPrintf.h)
- Se deber谩 producir el ejecutable de las dos maneras comentadas: compilando en una s贸la orden y separando la compilaci贸n y el montaje en 贸rdenes separadas
Ejercicio 2¶
Completar el c贸digo en la plantilla echo_simple.c para que el programa escriba en pantalla lo mismo que lee de teclado invocando la llamada al sistema scanf()
Plantilla echo_simple.c
#include <stdio.h>
int main(void) {
char mens[50];
return 0;
}
Ejemplo scanf()
Ejercicio 3: C la navaja suiza del programador¶
Hacking C
- gets() ha sido considerado obsoleto y, por tanto, su uso es desaconsejado (deprecated) desde el est谩ndar C11 y posteriores debido a su comportamiento inseguro (unsafe). Dado que no permite controlar el n煤mero de datos le铆dos puede facilitar buffer overflows
- En este caso es importante tambi茅n como ejemplo de c贸digo C/C++ causante de errores segmentation fault (core dumped)
El ejercicio consiste en compilar y comprobar el correcto funcionamiento del siguiente c贸digo
echo_depre.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* Posible orden de compilaci贸n:
* gcc -Wall -g echo.c -o bin/eco2
*/
int main(void) {
int num, i;
char str1[50], str2[10];
printf("Teclear un n煤mero\n");
/*
* Lo mismo que:
* fprintf(stdout, "Introducir n煤mero\n");
*/
scanf("%d", &num);
fprintf(stdout, "El n煤mero es %d\n", num);
/*
* OJO:
* scanf() dej贸 el '\n' (retorno de carro) en el buffer
* el siguiente scanf() se lo salta
*/
printf("Teclear otro n煤mero\n");
scanf("%d", &num);
fprintf(stdout, "El n煤mero es %d\n", num);
fprintf(stdout, "=================================\n");
fprintf(stdout, "Ahora teclear texto\n");
gets(str1);
/*
* OJO:
* gets() se come el '\n' abandonado en el buffer
* consume el '\n' pero no lo copia as铆 que no se imprime nada
*/
fprintf(stdout, "El texto es %s\n", str1);
fprintf(stdout, "Teclear otro texto\n");
gets(str1);
fprintf(stdout, "El texto ahora es %s\n", str1);
fprintf(stdout, "=================================\n");
/*
* C贸digo con fgets()
* Consume y copia el \n que cuenta como car谩cter le铆do
*/
fprintf(stdout, "Teclear un texto (long max 5 chars)\n");
fgets(str2, 6, stdin);
fprintf(stdout, "%s tiene longitud %ld\n", str2, strlen(str2));
fprintf(stderr, "Volcado en stderr del array str2:\n");
for (i = 0; i < 10; i++) {
fprintf (stdout, "%c:\%02hhx;",str2[i],str2[i]);
}
fprintf(stdout, "\n");
fprintf(stdout, "El texto ahora es: %s\n", str2);
return EXIT_SUCCESS;
}