2025(e)ko martxoaren 21(a), ostirala

Kate bat hartu: scanf(), gets() eta fgets()

ZER DAKIDAN:
Array datu-mota ezagutzen dut, eta kateak deritzen char datu-motako elementuen arrayak ezagutzen ditut ere.



ZER IKASIKO DUDAN:
Karaktere-kateak teklatutik irakurtzeko funtzio desberdinak erabiliko ditut:
  • gets() eta scanf()
  • fgets()
Gai honek jarraipena izango du Ariketa 52 | Bi kate irakurtzen artikuluan.


Kate bat hartu eta pantailaratu: gets() eta puts() funtzioak

Hurrengo lehen programan, kate bati balioa emateko bi irakurketa egiten dira teklatuaren bitartez. Lehen irakurketaren aginduak hauek dira:

      scanf("%s", sKatea);
      fflush(stdin);  // teklatuaren bufferra garbitzeko

Eta bigarren irakurketaren agindua hau da:

      gets(sKatea);

Zer gertatzen da gets(sKatea) egitean katearen neurri fisikoa gainditzen bada? Galdera honi erantzuten dio hurrengo bigarren programak.


Programa hau exekutatu eta ikusi bi irakurketen arteko aldea:

/* GetsPuts_1: katea irakurtzeko scanf() funtzioa ez da egokia izaten. */

// Karaktere-kateak '\0' markaz butazen diren arrayak dira C lengoaian
// scanf() funtzioa bukatu egiten da banatzaile bat aurkitzean, adibidez espazio bat.

#include <stdio.h>
#include <string.h>    // gets(), puts() eta strlen() funtzioetarako
#include <conio.h>     // getch() funtziorako

#define MAXIMOA 16     // katea mugatzeko konstantea,
                       // 15 karaktere + null mugatzailea
int main()
{
    char sKatea[MAXIMOA] = "";      // 16 null
    int iKont;

    printf("\n");
    printf("\n char sKatea[MAXIMOA]=\"\";  // hasieraketarekin");
    printf("\n Luzera=%d    sKatea=|%s|    puts()=", (int)strlen(sKatea), sKatea);
    puts(sKatea);
    printf("   ASCII KODEA       KARAKTEREA");
    printf("\n   -----------       ----------");
    for (iKont=0; iKont < strlen(sKatea)+1; iKont++)
    {
        printf("\n   sKatea[%d]=%3d    sKatea[%d]=%c", iKont, (int)sKatea[iKont], iKont, sKatea[iKont]);
        if (iKont == strlen(sKatea))
            printf("  <-- null marka");
    }

    printf("\n");
    printf("\n Zure izena eman (adibidez, Jon Ander): ");
    scanf("%s", sKatea);
    fflush(stdin);  // teklatuaren bufferra garbitzeko
    printf(" scanf(\"%%s\", sKatea);  // irakurketarekin");
    printf("\n Luzera=%d    sKatea=|%s|    puts()=", (int)strlen(sKatea), sKatea);
    puts(sKatea);
    printf("   ASCII KODEA       KARAKTEREA");
    printf("\n   -----------       ----------");
    for (iKont=0; iKont < strlen(sKatea)+1; iKont++)
    {
        printf("\n   sKatea[%d]=%3d    sKatea[%d]=%c", iKont, (int)sKatea[iKont], iKont, sKatea[iKont]);
        if (iKont == strlen(sKatea))
            printf("  <-- null marka");
    }

    printf("\n");
    printf("\n Zure izena eman (adibidez, Ana Mari): ");
    gets(sKatea);
    printf(" gets(sKatea);  // irakurketarekin");
    printf("\n Luzera=%d    sKatea=|%s|    puts()=", (int)strlen(sKatea), sKatea);
    puts(sKatea);
    printf("   ASCII KODEA       KARAKTEREA");
    printf("\n   -----------       ----------");
    for (iKont=0; iKont < strlen(sKatea)+1; iKont++)
    {
        printf("\n   sKatea[%d]=%3d    sKatea[%d]=%c", iKont, (int)sKatea[iKont], iKont, sKatea[iKont]);
        if (iKont == strlen(sKatea))
            printf("  <-- null marka");
    }

    printf("\n\n\n Edozein tekla sakatu exekuzioa amaitzeko... ");
    getch();

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


Programa hau exekutatu eta aztertu sKatea aldagaiari dagokion memorian gordetzen dena:

/* GetsPuts_2: katea irakurtzeen ez gainditu memoriako erreserba. */

// Karaktere-kateak '\0' markaz butazen diren arrayak dira C lengoaian
// Zer gertatzen da gets() funtzioaren bitartez MAXIMOA+2 karaktere sartzean?
// strcmp() funtzioa erabiltzen da kateen arteko alderaketak egiteko
// strlen() funtzioa erabiltzen da katearen luzera efektiboa lortzeko

#include <stdio.h>
#include <string.h>    // gets(), strcmp() eta strlen() funtzioetarako
#include <conio.h>     // getch() funtziorako

#define MAXIMOA  4     // katea mugatzeko konstantea,
                       // 3 karaktere + null mugatzailea
int main()
{
    char sKatea[MAXIMOA];
    int iKont;

    printf("\n");
    printf("\n Katearen neurri MAXIMOA = %d karaktere (3 karaktere + null)", MAXIMOA);

    printf("\n\n");
    do
    {
        printf(" %d karaktereko katea eman (sartu 0123456 katea): ", MAXIMOA+3);
        gets(sKatea);
    } while (strcmp(sKatea, "0123456") != 0);

    printf("\n   ASCII KODEA       KARAKTEREA");
    printf("\n   -----------       ----------");
    for (iKont=0; iKont < MAXIMOA+3; iKont++)
    {
        printf("\n   sKatea[%d]=%3d    sKatea[%d]=%c", iKont, (int)sKatea[iKont], iKont, sKatea[iKont]);
        if (iKont < MAXIMOA)
            printf("  <-- erreserbatutako posizioa");
        if ((iKont >= MAXIMOA) && (iKont < MAXIMOA+2))
            printf("   <-- edozein karaktere");
        if (iKont == MAXIMOA+2)
            printf("   <-- null karakterea");

    }

    printf("\n");
    do
    {
        printf("\n Gehienez %d karaktereko katea eman (adibidez, 01): ", MAXIMOA-1);
        gets(sKatea);
    } while (strlen(sKatea) >= MAXIMOA);
    printf("\n   ASCII KODEA       KARAKTEREA");
    printf("\n   -----------       ----------");
    for (iKont=0; iKont <= strlen(sKatea); iKont++)
    {
        printf("\n   sKatea[%d]=%3d    sKatea[%d]=%c", iKont, (int)sKatea[iKont], iKont, sKatea[iKont]);
        if (iKont == strlen(sKatea))
            printf("  <-- null karakterea");
    }

    printf("\n\n\n Edozein tekla sakatu exekuzioa amaitzeko... ");
    getch();

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


Kate bat irakurriko dugu, jakinik gehienez 6 datu-karaktere gorde ditzakeela, dakigulako 6 indizea duen zazpigarren posizioa \0 null karaktereari dagokiola. Programa honek bi egoera erakusten ditu:

  1. Ezarririk dagoen muga gainditzean fgets() funtzioak datua mozten du eta 6 indizedun zazpigarren posizioan \0 null karakterea jartzen du. Kontuz, mozturik geratu den zatiarekin, ez badugu teklatuaren bufferra garbitzen fflush(stdin) bitartez, hondarreko karaktere horiek hurrengo irakurketan erabiliko direlako.
  2. Ezarririk dagoen muga gainditzen ez bada, fgets() funtzioaren irakurketa amaiarazteko \n RETURN karakterea sakatu behar da teklatuan. Baina \n RETURN karakterea gorderik geratuko da katean (katearen bukaera bikote honek osatzen duela \n\0), eta horrelakorik ez dugulako nahi \n RETURN karakterea ezabatu beharko da katearen amaiera \0\0 izan dadin.
/* FGETS_funtzioa: kate bat irakurri haren neurria kontrolatuz. */

// fgets() funtzioa fitxategiekin lan egiteko asmatu da, baina
// stdin sarrera estandarra fitxategi baten itxura hartzen duenez
// kateak teklatuaren bitartez irakurtzean erabiliko dugu.

#include <stdio.h>
#include <string.h>    // fgets() eta strlen() funtzioetarako
#include <conio.h>     // getch() funtziorako

#define MAXIMOA 7     // katea mugatzeko konstantea,
                      // 6 karaktere + null mugatzailea
int main()
{
    char sKatea[MAXIMOA];  // 6 karaktere + null gordetzeko katea

    printf("\n\n ----Lehen kasua: maximoa baino karaktere gehiago sartzean-------------\n");

    printf("\n Karaktere kopuru maximoa %d izan arren, ondoko datu luzea eman...", MAXIMOA-1);
    printf("\n Lehen katea eman (adibidez, luzeegia den hau 123456789): ");
    fgets(sKatea, MAXIMOA, stdin);
    fflush(stdin);   // teklatuaren bufferra garbitu
    printf(" Lehen katea sKatea=|%s|      %d karaktere", sKatea, strlen(sKatea));

    printf("\n\n");

    printf("\n\n ----Bigarren kasua: irakurketa RETURN bitartez amaiaraztean-----------\n");

    printf("\n Karaktere kopuru maximoa %d delako, muga hori ez gainditu...", MAXIMOA-1);
    printf("\n Bigarren katea laburra izan dadila (adibidez, 9876): ");
    fgets(sKatea, MAXIMOA, stdin);
    // fflush(stdin);   // programa honetan agindu hau soberan egon daiteke
    printf(" Bigarren katearen luzera %d karaktere, null marka ere hartu duelako\n", (int)strlen(sKatea));
    // if (sKatea[strlen(sKatea)-1] == '\n')  // RETURN azkena izango da
        sKatea[strlen(sKatea)-1] = '\0';      // RETURN karakterea kendu
    printf(" Bigarren katea null marka kendu ondoren sKatea=|%s|    %d karaktere", sKatea, (int)strlen(sKatea));

    printf("\n\n Edozein tekla sakatu exekuzioa amaitzeko... ");
    getch();

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






  • GETS-PUTS_funtzioak-1.cbp | main.c  
  • GETS-PUTS_funtzioak-2.cbp | main.c  
  • FGETS_funtzioa.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina