| ZER DAKIDAN: Arrayak eta kateak ezagutzen ditut. ZER IKASIKO DUDAN: Arrayen ariketa bat egingo dut. |
Esaldi bat fgets() bitartez irakurri ondoren (noski, azken INTRO karakterea kendu beharko da), esaldiaren hitzak banatu beharko dira eta horretarako strtok() funtzioa erabiliko da.
/* Ariketa-54_Akronimoak: kate bat emanik bere akronimoak lortzen ditu. */
// Datua fgets() bitartez irakurri ondoren, azken INTRO karakterea kendu beharko da.
// Ariketaren funtsa strtok() funtzioaren erabileran dago.
#include <stdio.h>
#include <stdlib.h> // system(cls) funtziorako
#include <string.h> // strtok(), strlen(), strcpy() eta strcspn() funtzioetarako
#include <ctype.h> // toupper() funtziorako
#include <stdbool.h> // bool datu-motarako
#include <conio.h> // getch() funtziorako
void AkronimoakLortu(char* sEsaldia, char* sEmaitza);
void KateaIkusi(const char sKatea[101]);
int main()
{
char sKatea[101];
char sKateKopia[101];
char sEmaitza[51];
char cAukera;
int iReturnIndizea;
int iZeroKarakIndizea;
printf("Esaldi baten akronimoak lortzeko programa.\n\n");
// begizta nagusia
do
{
// esaldia eskatu erabiltzaileari
do
{
printf("Sar ezazu sarrerako testua: ");
fgets(sKatea, sizeof(sKatea), stdin);
iReturnIndizea = strcspn(sKatea, "\n");
printf("RETURN karakterea %d. posizioan dago\n", iReturnIndizea);
iZeroKarakIndizea = strcspn(sKatea, "\0");
printf(" ZERO karakterea %d. posizioan dago\n", iZeroKarakIndizea);
KateaIkusi(sKatea);
sKatea[iReturnIndizea] = '\0'; // RETURN karakterea kendu
//sKatea[strlen(sKatea)-1] = '\0'; // RETURN karakterea kentzeko
} while (strlen(sKatea) == 0); // kate hutsa ez dugu onartzen
strcpy(sKateKopia, sKatea);
AkronimoakLortu(sKateKopia, sEmaitza);
printf("%s ---> %s\n", sKatea, sEmaitza);
// beste iterazio bat?
printf("Beste testuren bat aztertu nahi duzu: (B ala E): ");
do
{
cAukera = toupper(getch());
} while ((cAukera != 'B') && (cAukera != 'E'));
system("cls"); // pantaila garbitzeko
} while (cAukera != 'E');
return 0;
}
// Akronimoak lortzen dituen funtzioa, ssEsaldia sarrerako parametroa
// espazioen arabera mozten joan eta iterazio bakoitzeko lehen letra hartu
void AkronimoakLortu(char* sEsaldia, char* sEmaitza)
{
char *erakTokena;
bool boLehendabizikoa = true;
char sLaguntzailea[3];
// sarrerako katea larrietan jarri
for(int i = 0; sEsaldia[i]; i++)
{
sEsaldia[i] = toupper(sEsaldia[i]);
}
// hitz bakoitzaren lehen letra hartu, parametroak: katea eta kate banatzailea
erakTokena = strtok(sEsaldia, " ");
while (erakTokena != NULL)
{
if (boLehendabizikoa)
{
sEmaitza[0] = erakTokena[0]; // hitzaren lehen letra
sEmaitza[1] = '.'; // puntua
sEmaitza[2] = '\0'; // null mugatzailea
boLehendabizikoa = false;
}
else
{
sLaguntzailea[0] = erakTokena[0]; // hurrengo hitzaren lehen letra
sLaguntzailea[1] = '.'; // puntua
sLaguntzailea[2] = '\0'; // null mugatzailea
strcat(sEmaitza, sLaguntzailea); // kateaketa
}
// hurrengo tokena eskuratu, parametroak: NULL eta kate banatzailea
erakTokena = strtok(NULL, " ");
}
}
// Katearen /0 karakterea ikusteko eta RETURN karakterea ikusteko
void KateaIkusi(const char sKatea[101])
{
printf("\n");
// sarrerako katea pantailaratu, bere luzera +1 karaktere erakutsiz
for(int iKont = 0; iKont <= strlen(sKatea); iKont++)
{
printf("\t iKont=%d \t sKatea[iKont]=%c \t sKatea[iKont]=%d\n", iKont, sKatea[iKont], sKatea[iKont]);
}
printf("\n");
}
iruzkinik ez:
Argitaratu iruzkina