Saltar a contenido

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

lab_strtol.png

Ejercicio ampliado

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

Referencias 煤tiles