Intro Punteros
Ejercicio de Autoevaluaci贸n
Caracter铆sticas del programa:
- Lee strings de stdin con fgets()
- Manejo de punteros (doble indirecci贸n)
- Si encuentra un n煤mero en el string lo convierte al tipo long e imprime el resto de la cadena en pantalla
- ATENCI脫N uso del puntero **endptr
Llamada strtol()
P谩gina del manual: man strtol.3
long strtol(const char *restrict nptr, char **endptr, int base);
Ejemplo b谩sico de utilizaci贸n
Este ejemplo es complementario al mostrado en el apartado 煤ltimo Niveles de indirecci贸n de la Introducci贸n a Punteros
| ej_strtol.c |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | /*
* C贸digo C para mostrar el uso de strol()
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str1[40] = "20000 leguas de viaje submarino";
char str2[20] = "0123456789 d铆gitos";
long lint;
char* ptr;
lint = strtol(str1, &ptr, 10);
printf("Valor entero: %lu\n", lint);
printf("Resto de la cadena: %s\n", ptr);
/*
馃憠 If endptr is not NULL, and the base is supported, strtol() stores
the address of the first invalid character in *endptr. If there
were no digits at all, strtol() stores the original value of nptr
in *endptr (and returns 0). In particular, if *nptr is not '\0'
but **endptr is '\0' on return, the entire string is valid.
*/
lint = strtol(str2, NULL, 10);
printf("Valor entero: %lu\n", lint);
return 0;
}
|
Esqueleto de c贸digo para el ejercicio
| lab_strtol.c |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 | /*
* Definici贸n de ctes simb贸licas. Tarea para el preprocesador
*/
#define OK 0
#define MAX 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[MAX+1];
char *ptr = str;
int l;
long nums[MAX] = {0, 0, 0, 0, 0};
long ret = 1;
int i = 0, j;
printf("==========================================================\n");
printf("\tMemoria requerida (bytes) por str:\t%d\n", (int) sizeof(str));
printf("\tMemoria requerida (bytes) por ptr:\t%d\n", (int) sizeof(ptr));
printf("\tMemoria requerida (bytes) por ret:\t%d\n", (int) sizeof(ret));
printf("\tMemoria requerida (bytes) por nums:\t%d\n", (int) sizeof(nums));
printf("==========================================================\n\n");
memset(str, 0, MAX+1);
printf("Teclear strings (max %d caracteres). ^D para salir:\n", MAX);
while(fgets(ptr, MAX+1, stdin)) {
l = (int) strlen(ptr);
if(str[l-1] == '\n')
str[l-1] = '\0';
printf("\tLe铆dos %d chars", l);
printf(": %s\n", ptr);
/*
* Completar el c贸digo utilizando la llamada strtol()
*/
}
/*
* Imprimir array de n煤meros
*/
if (i>0) {
printf("\nnums[]={%ld", nums[0]);
for(j = 1; j < i; j++)
printf(",%ld", nums[j]);
printf("}\n");
}
return(OK);
}
|
Ejemplo de ejecuci贸n

Ejercicio ampliado
Modificar el c贸digo previo de manera que se procesen todos lo n煤meros presentes en la cadena