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:
|
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:
- 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.
- 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; }
iruzkinik ez:
Argitaratu iruzkina