Page 373

B La lectura de datos por teclado, paso a paso

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

La funci´on lee el 2 y encuentra un salto de l´ınea. El estado en el que queda el programa es ´este: u 0

a

n 1

o 2

\n

3

4

2 5

\n 6

7

8

9

u n o \0

i 2 F´ıjate bien en qu´e ha ocurrido: nos hemos quedado a las puertas de procesar el salto de l´ınea. Cuando el programa pasa a ejecutar el siguiente gets, ¡lee una cadena vac´ıa! ¿Por qu´e? Porque gets lee caracteres hasta el primer salto de l´ınea, y el primer car´acter con que nos encontramos ya es un salto de l´ınea. Pasamos, pues, a este nuevo estado: u 0

a

n 1

o 2

\n

3

2

\n

4

5

6

7

8

9

4

5

6

7

8

9

u n o \0

i 2 0

b

1

2

3

\0

¿C´omo podemos evitar este problema? Una soluci´on posible consiste en consumir la cadena vac´ıa con un gets extra y una variable auxiliar. F´ıjate en este programa: lee alterno bien.c

lee alterno bien.c 1

#include <stdio.h>

2 3

#define TALLA 80

4 5 6 7 8 9

int main(void) { char a[TALLA+1], b[TALLA+1]; int i; char findelinea[TALLA+1]; // Cadena auxiliar. Su contenido no nos importa.

10

printf ("Cadena a: "); gets(a); printf ("Entero i: "); scanf ("%d", &i); gets(findelinea); printf ("Cadena b: "); gets(b); printf ("La cadena a es %s, el entero i es %d y la cadena b es %s\n", a, i, b);

11 12 13 14 15

return 0;

16 17

}

Hemos introducido una variable extra, findelinea, cuyo u ´nico objetivo es consumir lo que scanf no ha consumido. Gracias a ella, ´este es el estado en que nos encontramos justo antes de empezar la lectura de b: u 0

a

n 1

o 2

3

\n

2

\n

4

5

6

7

8

9

4

5

6

7

8

9

u n o \0

i 2 0

findelinea Introducci´ on a la Programaci´ on con C

1

2

3

\0 367

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement