2024(e)ko abenduaren 1(a), igandea

scanf(), lehen hurbilketa


scanf
#include <stdio.h>

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

Aipatzen ari garen scanf() funtzioa helburu orokorreko errutina bat da, stdin gailutik irakurtzen duena (stdin sarrerako gailu estandarra, normalean teklatua) eta ENTER edo RETURN tekla sakatzean irakurketa burutzen da. Funtzioaren deian adierazten diren datu-motak irakurri eta barne-formatu egokian eralda ditzake. Nolabait, scanf() funtzioa printf() funtzioaren alderantzizkoa da. Formatuaren arabera zehaztutako kontrol-kateak hiru karaktere mota izango ditu:

  • Formatu-espezifikatzaileak (edo formatu-zehaztatzaileak)
  • Zuriunearen karaktereak
  • Zuriuneak ez diren karaktereak

Sarrerako formatu-zehaztatzaileen aurretik % sinboloa dago, eta scanf() funtzioari adierazten diote zer datu mota irakurriko den jarraian. Formatu-espezifikatzaileak hauek dira non kolore berdez adierazten direnak ikastekoak diren:

scanf() funtzioaren formatu-zehaztatzaileak
 Zehaz.  Deskribapena  Adibidea Ikasi
   %c Karaktere bakarra irakurri. w BAI
   %s Karaktere-katea irakurri. kaixo BAI
   %d Irakurri osoko hamartarra zeinuarekin. -9125 BAI
   %i Irakurri osoko hamartarra zeinuarekin. +9125 EZ
   %u Irakurri osoko hamartarra zeinurik gabe. 1299 BAI
   %f Irakurri zenbaki erreala edo puntu flotatzailea. 74.93 BAI
   %e Irakurri notazio zientifikoko zenbaki erreala (e xehea). 3.926e+2 BAI
   %E Irakurri notazio zientifikoko zenbaki erreala (E larria). 3.926E+2 BAI
   %g %e eta %f artean laburrena erabili. 392.6 EZ
   %G %E eta %f artean laburrena erabili. 392.6 EZ
   %o Zortzitarra zeinurik gabe. 707 EZ
   %x Hamaseitarra, zeinurik gabeak (letra xeheak). 3fb EZ
   %X Hamaseitarra, zeinurik gabeak (letra larriak). 3FB EZ
   %p Erakusle baten edukia irakurri. b7000000 EZ
   %n Irakurritako karaktere-zenbakiaren balio bera jasotzen du.   EZ


Gainera, h (short), l (long) eta L (long) aldatzaileak daude eta printf() funtzioarekin bezala erabil daitezke. Honela:

  • h (short) aldatzailea d, i, u, o, x eta X datu-motei aplika dakieke, eta esaten digu datu-mota short int dela edo unsigned short int dela, kasuaren arabera.
  • l (long) aldatzailea aurreko kasuetan aplika daiteke (d, i, u, o, x eta X), eta adierazten du datu-mota long int dela edo unsigned long int dela, baina, horrez gain...
  • l (long) aldatzailea e, E, f eta g datu-motei ere aplika dakieke, datu-mota double dela adieraziz.
  • L (long) aldatzailea e, E, f eta g datu-motei aplika dakieke, eta datu-mota long double dela adierazten du.

Balioak jasotzeko scanf() funtzioaren aldagai guztiak erreferentzia bidez pasatu behar dira, hau da, haien helbideak pasarazi behar dira. Horregatik, zenbaki osoko baten aldagaiaren parametroa honela agertuko da &iAltuera non & sinboloak aldagaiaren helbidea adierazen duen.

Bestalde, scanf() funtzioak zuzen esleitu diren eremuen kopuru bera itzultzen du.

Hona hemen scanf() funtzioaren hainbat adibide dituen programa:

/* SCANF_1-hurbilketa.cbp proiektua, scanf funtzioaren lehen hurbilketa: zenbaki osoak edo errealak. */

// Programa honetan scanf() funtzioa ikasiko dugu, zenbakiekin lan eginez.
// Aldagai baten balioa irakurtzeko, gehien gehienetan, scanf() bana erabiliko dugu.
// Baina scanf() berak aldagai bat baino gehiago irakur ditzake, banatzaile egokia jarriz.

#include <stdio.h>

int main()
{
   int iAltuera, iOinarria, iAzalera;

   printf("\n\n");
   printf("Zenbaki osoekin lan eginez...");

   printf("\n\n");
   printf("Laukizuzenaren altuera sartu: ");
   scanf("%d", &iAltuera);
   printf("Laukizuzenaren oinarria eman: ");
   scanf("%d", &iOinarria);

   iAzalera = iAltuera*iOinarria;

   printf("Laukizuzenaren azalera %d da", iAzalera);
   printf("\nLaukizuzenaren azalera, %dx%d = %d", iAltuera, iOinarria, iAzalera);
   printf("\n\n");

   printf("Biak eman, altuera eta oinarria (zuriunez banatu): ");
   scanf("%d %d", &iAltuera, &iOinarria);   // HONELA EZ DUGU EGINGO

   iAzalera = iAltuera*iOinarria;

   printf("Laukizuzenaren azalera %d da", iAzalera);
   printf("\nLaukizuzenaren azalera, %dx%d = %d", iAltuera, iOinarria, iAzalera);
   printf("\n\n");

   printf("Biak eman, altuera eta oinarria (banatzeko :: karaktereak): ");
   scanf("%d::%d", &iAltuera, &iOinarria);   // HONELA EZ DUGU EGINGO

   iAzalera = iAltuera*iOinarria;

   printf("Laukizuzenaren azalera %d da", iAzalera);
   printf("\nLaukizuzenaren azalera, %dx%d = %d", iAltuera, iOinarria, iAzalera);
   printf("\n\n");

   return 0;
}


Esan den bezala, scanf() funtzioak aldagaiaren helbidea behar du eta horregatik aldagaiaren identifikadorearen aurrean & sinboloa idatzi beharra dago, hots, & helbide-operadorea. Baina, aldagaiaren identifikadorea soilik idazten badugu & sinbolorik gabe, zer gertatzen da? Jarraian ematen den SCANF_1-txarto.cbp proiektua aztertu:
/* SCANF_1-txarto.cbp proiektua, scanf() bitartez zenbaki bat irakurtzen. */

// Programa honetan scanf() funtzioa aplikatzean, kontrol-katea den lehen
// parametroan %f formatu-zehaztatzailea idatziko da, eta, bigarren parame-
// troan aldagaiaren helbidea zehaztu beharrean aldagaia idatziko da.
// Proiektua konpilatzean abisu bat agertuko da:
/*
 ||=== Build: Debug in SCANF_1-txarto (compiler: GNU GCC Compiler) ===|
 warning: format '%f' expects argument of type 'float *', but argument 2 has type 'double'
 ||=== Build finished: 0 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
*/
// Eta proiektua exekutatzean scanf() ondoren programaren exekuzioa bukatzen da
// modu desegokian, ikus daitekeen bezala main() funtzioak ez du 0 itzultzen.

#include <stdio.h>

int main()
{
   float fAltuera = 3.2;
   float fOinarria = 4.4;
   float fLuzera = 7.1;

   printf("\nZenbaki errealekin lan eginez...");

   printf("\n\n");
   printf("  fLuzera:  edukia=%.2f  helbidea=%d  (float batek 4 byte hartzen ditu)\n", fLuzera, (int)&fLuzera);
   printf("fOinarria:  edukia=%.2f  helbidea=%d  (float batek 4 byte hartzen ditu)\n", fOinarria, (int)&fOinarria);
   printf(" fAltuera:  edukia=%.2f  helbidea=%d  (float batek 4 byte hartzen ditu)\n", fAltuera, (int)&fAltuera);

   printf("\nPrismaren altuera sartu: ");
   scanf("%f", fAltuera);   // txarto, scanf() funtzioak aldagaiaren HELBIDEA behar duelako
   // scanf() funtzioak huts egiten badu, exekuzioa hemen bukatzen da eta hurrengoa EZ DA PANTAILARATUKO
   printf("Prismaren altuera %.2f da.", fAltuera);

   printf("\n\n");
   return 0;
}

Irudi honetan erakusten dira SCANF_1-txarto.cbp proiektuan erabiltzen diren hiru aldagaien nondik norakoak. Hirurak float datu-motakoak izanik bakoitzak 4 byte hartzen ditu memorian. Irudian agertzen diren zenbakiak sistema hamartarrean adierazi dira azalpena erraztearren; baina makina digital bat delako, egiari zor, benetako balioak sistema bitarrean kodeturik egongo dira:

Irudian agertzen diren zenbakizko balio guztiak kode bitarrean idatzi beharko lirateke.

Hauxe da SCANF_1-txarto.cbp proiektua exekutatzean lortzen den irteera:

Datua emateko scanf("%f",fAltuera) irakurketa egitean, programak txarto bukatzen du.

Baina SCANF_1-txarto.cbp proiekuan main.c fitxategiko irakurketa ondo idatziz —honela idatziz scanf("%f",&fAltuera)— lortzen den irteera beste hau da:

Datua emateko scanf("%f",&fAltuera) irakurketa egitean, programa ondo ibiliko da.






  • SCANF_1-hurbilketa.cbp | main.c  
  • SCANF_1-txarto.cbp | main.c

 

iruzkinik ez:

Argitaratu iruzkina