2025(e)ko otsailaren 19(a), asteazkena

scanf(), bigarren hurbilketa

scanf
#include <stdio.h>

int scanf(const char * formatukatea, argumentu1, argumentu2, ...);

Ezaguna zaigu scanf() funtzioa scanf(), lehen hurbilketa artikuluan azaldu zelako eta sarritan erabili dugulako. Badakigu scanf()funtzioa helburu orokorreko errutina dela eta teklatutik datua irakurtzeko ENTER tekla sakatu beharra dagoela.

ENTER tekla ASCII taulako 10. karakterea da eta ez du arazorik emanten scanf(), lehen hurbilketa artikuluan erakutsitako programetan datuak zenbakizkoak direlako. Baina, eta irakurri beharreko datua karaktere bat bada? Nola jokatzen du ENTER karaktereak?

Programa hau aztertu, non teklatuaren bufferra garbitzeko fflush(stdin) funtzioa erabili beharra dagoen. Nahi izanez gero, fflush(stdin) funtzioaren ordez getchar() funtzioa erabil daiteke.

/* SCANF_2-hurbilketa.cbp proiektua, scanf() funtzioaren bigarren hurbilketa: karaktereak. */

// Programa honetan scanf() funtzioa ikasiko dugu, karaktereekin lan eginez.
// Programa honetan hiru scanf() daude eta bakoitzak karaktere bana irakurtzen du.
// Ikusi teklatuaren bufferra garbitzen duen fflush(stdin) funtzioa behar dugula.

// Hiru fflush(stdin) deiak iruzkintzean hau gertatzen da:
// ------------------------------------------------------
// Lehen irakurketan: karakterea + ENTER, ondorioz karakterea 'cLetra1' aldagaian
// eta ENTER teklatuaren bufferrean geratzen da.
// Bigarren irakurketan: teklatuaren bufferreko ENTER karakterea 'cLetra2' aldagaian
// eta teklatuaren bufferra hutsik.
// Hirugarren irakurketan: karakterea + ENTER, ondorioz karakterea 'cLetra3' aldagaian
// eta ENTER teklatuaren bufferrean.
// Aurrekoa frogatzeko, karaktereen ordinalak pantailaratzen dira, non ENTER
// karakterearen ordinala 10 den.

// Hiru fflush(stdin) deiak indarrean direnean hau gertatzen da:
// ------------------------------------------------------------
// Lehen irakurketan: karakterea + ENTER, ondorioz karakterea 'cLetra1' aldagaian
// eta teklatuaren bufferrean geratu den ENTER karakterea galtzen da.
// Bigarren irakurketan: teklatuaren bufferreko ENTER karakterea 'cLetra2' aldagaian
// eta teklatuaren bufferrean geratu den ENTER karakterea galtzen da.
// Hirugarren irakurketan: karakterea + ENTER, ondorioz karakterea 'cLetra3' aldagaian
// eta teklatuaren bufferrean geratu den ENTER karakterea galtzen da.

// fflush(stdin) funtzioa ez dabil Mac eta Unix sisteman,
//               bere ordez fpurge(stdin) erabili behar da.

#include <stdio.h>

int main()
{
   char cLetra1, cLetra2, cLetra3;

   printf("\n");
   printf("Lehen karakterea eman (adib. 'A'): ");
   scanf("%c", &cLetra1);
   fflush(stdin);   // froga egiteko agindu hau iruzkindu

   printf("Bigarren karakterea eman (adib. 'B'): ");
   scanf("%c", &cLetra2);
   fflush(stdin);

   printf("Hirugarren karakterea eman (adib. 'C'): ");
   scanf("%c", &cLetra3);
   fflush(stdin);

   printf("Balioak: '%c', '%c' eta '%c'.\n", cLetra1, cLetra2, cLetra3);
   printf("Balioak: '%d', '%d' eta '%d'.\n", cLetra1, cLetra2, cLetra3);

   return 0;
}

Hauxe da aurreko programak eskaintzen duen irteera 39. lerroko fflush(stdin) funtzioa iruzkindu ondoren, proiektua konpilatu eta egikaratu egiten bada:

Lehen scanf() funtzioan A karakterea cLetra1 aldagaian. Bigarren scanf() funtzioan bufferreko ENTER
karakterea
cLetra2 aldagaian. Hirugarren scanf() funtzioan C karakterea cLetra3 aldagaian.

Goiko irudiaren azalpena:

  1. Lehen scanf() funtzioaren bitarteko irakurketan A karakterea eman da eta ENTER karakterea sartuz bukatzen da; ondorioz, A karakterea cLetra1 aldagaian gordetzen da eta ENTER karakterea (sistema hamaseitarrean \x10 segidaz adieraz daitekeen karakterea, bere ASCII taulako posizioa 10 baita) teklatuaren buffer delako memoria zatian kokatzen da.
  2. Bigarren scanf() funtzioak bufferrean dagoen ENTER karakterea hartu eta cLetra2 aldagaian gordez aurrera egiten du erabiltzaileari itxaron gabe. Ondorioz, bufferra dagoeneko hutsik dago, baina ez balego fflush() funtzioak hustuko luke, horregatik...
  3. Hirugarren scanf() funtzioak bufferra hutsik aurkitzen du eta itxaron egiten du erabiltzaileak daturen bat sartu arte cLetra3 aldagairako, irudian erabiltzaileak C karakterea eman du eta ENTER karakterearekin bukatzen du datuaren sartzea (ENTER karaktere hau teklatuaren buferretik kenduko du fflush() funtzioak).
 

iruzkinik ez:

Argitaratu iruzkina