C keele getchar funktsioon: põhikasutus, näited ja praktilised nõuanded

1. Mis on getchar funktsioon?

getchar funktsioon on üks põhilisi sisestusmeetodeid C programmeerimiskeeles – see loeb ühe märgi standardse sisendi kaudu. Kui kasutaja sisestab klaviatuurilt märgi, tagastab see funktsioon selle märgi ASCII koodi, mis teeb selle mugavaks lihtsate sisestustoimingute jaoks. Näiteks kasutatakse seda, kui on vaja töödelda kasutaja sisestatud märke ükshaaval.

getchar funktsiooni omadused

  • Võtab vastu ühe märgi standardse sisendi kaudu: ootab, kuni kasutaja sisestab märgi ja vajutab Enter-klahvi, seejärel alustab töötlemist.
  • Tagastab ASCII koodi: loetud märk tagastatakse ASCII koodina, mitte märgina. Märgina kasutamiseks tuleb see vajadusel teisendada.

getchar on eriti sobiv lihtsate kasutajasise sisestusülesannete või interaktiivsete programmide jaoks. Seda kasutatakse sageli C keele õppimise algstaadiumis, kuna seda on lihtne kasutada võrreldes teiste sisendfunktsioonidega.

Näide kasutamisest

Allpool on toodud lihtne sisestusnäide, kus kasutatakse getchar funktsiooni.

#include <stdio.h>

int main() {
    int c;
    printf("Sisesta märk: ");
    c = getchar();
    printf("Sisestatud märk: %c\n", c);
    return 0;
}

Selles programmis loetakse kasutaja sisestatud üks märk klaviatuurilt ja kuvatakse see ekraanile. Kui näiteks sisestada “A”, on väljund järgmine:

Sisesta märk: A
Sisestatud märk: A

2. getchar funktsiooni põhiline kasutamine

Põhifunktsiooni kutsumine

getchar funktsiooni kasutatakse järgmiselt:

int getchar(void);

See ei võta argumente, loeb ühe märgi ja tagastab selle ASCII koodi. Tagastustüüp on täisarv (int) ning vea korral tagastab EOF (End Of File).

Lihtne märgi sisestuse näide

Ülaltoodud näites loeti üks märk ja kuvati see ekraanile. getchar sobib hästi juhul, kui on vaja töödelda ainult ühte märki.

#include <stdio.h>

int main() {
    int c;
    printf("Sisesta märk: ");
    c = getchar();
    printf("Sisestatud märk: %c\n", c);
    return 0;
}

Selles koodis loeb getchar sisestatud märgi ja printf kuvab selle ekraanile.

年収訴求

3. getchar funktsiooni praktilised näited

EOF (faili lõpp) ja getchar

getchar ei loe ainult märke, vaid tagastab EOF (End Of File), kui sisendi lõpp on saavutatud. Näiteks saab tuvastada EOF, kui kasutaja vajutab “Ctrl+Z” (Windows) või “Ctrl+D” (Unix).

Järgmine näide loeb märke seni, kuni sisestatakse EOF.

#include <stdio.h>

int main() {
    int c;
    printf("Sisesta märke (lõpetamiseks EOF): ");
    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    return 0;
}

See kood kasutab getchar ja putchar funktsioone, et kuvada iga sisestatud märk ekraanile kuni EOF sisestamiseni.

Mitme märgi sisestamine

Mitut märki saab lugeda getchar abil, näiteks kuni reavahetusmärgi (newline) sisestamiseni. Alltoodud kood kuvab iga sisestatud märgi seni, kuni vajutatakse Enter-klahvi.

#include <stdio.h>

int main() {
    int c;
    printf("Sisesta sõne: ");
    while ((c = getchar()) != '\n') {
        printf("Sisestatud märk: %c\n", c);
    }
    return 0;
}

See programm loeb märke ükshaaval ja kuvab need ekraanile. Tsükkel lõpeb, kui sisestatakse reavahetus.

4. EOF ja puhverdatud sisend

EOF tähendus

EOF (End Of File) tähistab faili või sisendi lõppu. getchar tagastab -1, kui jõuab EOF-i, ning programm saab selle põhjal töö lõpetada. Klaviatuurilt saab EOF-i sisestada spetsiaalse klahvikombinatsiooniga.

Puhverdamine ja getchar

getchar kasutab sisendi puhverdamist – kõik sisestatud märgid salvestatakse puhvris. Kui getchar kutsutakse mitu korda, tagastatakse järgmine märk puhvrist. Seetõttu ei liigu programm edasi enne, kui sisestatakse reavahetus (Enter).

Puhvris oleva reavahetuse eiramiseks saab kasutada järgmist tehnikat:

#include <stdio.h>

int main() {
    int c;
    printf("Sisesta märk: ");
    c = getchar();
    while (getchar() != '\n');  // Eirab puhvris olevat reavahetust
    printf("Sisestatud märk: %c\n", c);
    return 0;
}

See kood eirab puhvris olevat reavahetusmärki enne sisestatud märgi kuvamist.

5. getchar funktsioon vs teised sisendfunktsioonid

Erinevus getchar ja scanf vahel

Nii getchar kui ka scanf loevad sisendit, kuid nende kasutusviisid erinevad. scanf võimaldab kasutada vormindajat, et sisestada täisarve, ujukomaga arve, sõne jne. getchar on seevastu väga lihtne – see loeb ainult ühe märgi.

Näide sisestusest scanf abil:

#include <stdio.h>

int main() {
    int num;
    printf("Sisesta arv: ");
    scanf("%d", &num);
    printf("Sisestatud arv: %d\n", num);
    return 0;
}

See kood kasutab scanf täisarvu lugemiseks ja kuvamiseks. scanf sobib erinevate andmetüüpide ning mitme väärtuse üheaegseks sisestamiseks.

Erinevus getchar ja fgets vahel

fgets erineb getchar-ist selle poolest, et loeb korraga mitu märki (sõne). See on väga mugav, kui on vaja lugeda kasutaja sisestatud tekstiridu. fgets võimaldab määrata puhvrimahu ja aitab vältida bufrioverflow probleeme, mis võivad scanf-i kasutamisel tekkida.

Näide sisestusest fgets abil:

#include <stdio.h>

int main() {
    char str[100];
    printf("Sisesta sõne: ");
    fgets(str, sizeof(str), stdin);
    printf("Sisestatud sõne: %s", str);
    return 0;
}

See kood loeb ja kuvab sõne, kasutades fgets. fgets loeb kogu rea (kuni reavahetuseni), seega sobib see ka mitmerealise sisendi töötlemiseks.

getchar, scanf ja fgets kasutusviisid

  • getchar sobib ühe märgi sisendi töötlemiseks – näiteks menüüvalikute või klahvivajutuste jaoks.
  • scanf sobib mitut tüüpi andmete (arvud, sõned) lugemiseks, kuid vajab põhjalikku veakontrolli.
  • fgets sobib pikkade sõnede või mitmerealiste andmete lugemiseks. Lisaks saab määrata, mitu märki korraga loetakse, mis aitab vältida bufrioverflow’d.

6. Praktika: interaktiivne programm getchar abil

getchar on kasulik kasutaja sisendi põhjal töötavate interaktiivsete programmide loomiseks. Allpool on näide, kuidas kindla klahvivajutuse peale sooritada erinevaid toiminguid – see on kasulik näiteks lihtsa menüü või mängu loomiseks.

Näidiskood: menüü juhtimine märgi sisestusel

#include <stdio.h>

int main() {
    char choice;
    printf("Vali menüü (a: Tere, b: Välju): ");
    choice = getchar();

    switch (choice) {
        case 'a':
            printf("Tere!\n");
            break;
        case 'b':
            printf("Programm lõpetatakse.\n");
            break;
        default:
            printf("Vigane valik.\n");
    }

    return 0;
}

Selles programmis saab kasutaja sisestada kas ‘a’ või ‘b’ ja vastavalt kuvatakse sõnum. getchar võimaldab lihtsa menüü teostust ning kasutaja sisendile reageerimist.

Edasijõudnud programm: mitu käsku

Alljärgnev kood sooritab erinevaid toiminguid sõltuvalt sisestatud käsust (näiteks ‘l’, ‘h’, ‘q’).

#include <stdio.h>

int main() {
    char command;
    printf("Sisesta käsk (l: kuva nimekiri, h: tervitus, q: välju): ");
    command = getchar();

    switch (command) {
        case 'l':
            printf("Nimekiri kuvatakse.\n");
            break;
        case 'h':
            printf("Tere!\n");
            break;
        case 'q':
            printf("Programm lõpetatakse.\n");
            break;
        default:
            printf("Vigane käsk.\n");
    }

    return 0;
}

Selles programmis täidetakse erinevad toimingud sõltuvalt kasutaja sisestatud käsust (l, h, q).

7. getchar funktsiooni probleemid ja parimad praktikad

Levinud probleem: puhvri töötlemine

getchar kasutamisel on oluline arvestada, et sisendi puhvris olevad andmed võivad mõjutada järgmist sisestust. Näiteks pärast ühte getchar väljakutset võib järgmine getchar lugeda puhvris olevat reavahetusmärki. Selliste olukordade vältimiseks tuleb vajadusel puhverdada sisend.

Kuidas eirata reavahetust:

#include <stdio.h>

int main() {
    int c;
    printf("Sisesta märk: ");
    c = getchar();
    while (getchar() != '\n');  // Eirab reavahetust
    printf("Sisestatud märk: %c\n", c);
    return 0;
}

Selles koodis kasutatakse while tsüklit, et lugeda ja eirata puhvris olev reavahetus, enne kui kuvatakse sisestatud märk.

Parimad praktikad

  1. Puhvri tühjendamine: veendu, et sisestuse ajal töödeldakse puhvris olev reavahetus, et see ei mõjutaks järgmist sisestust.
  2. Veakontroll: kui getchar tagastab EOF, töödelda seda korrektselt – eriti failisisestuse korral.
  3. Sisendi piirangud: pikkade sõnede või teatud tingimustega sisendi puhul tasub kaaluda fgets kasutamist, kuna sellega saab piirata sisestatavate märkide arvu ja vältida bufrioverflow’d.

8. Kokkuvõte ja järgmised sammud

Selles artiklis tutvustati getchar funktsiooni põhikasutust ja praktilisi näiteid ning võrreldi seda scanf ja fgets funktsioonidega. getchar on lihtne, kuid võimas tööriist, mis sobib hästi interaktiivsete programmide ja lihtsate sisestuste jaoks.

Edasised sammud

  1. fgets ja scanf sügavam kasutamine: kui soovid töödelda sõnede või arvude sisestust, tasub õppida ka fgets ja scanf kasutamist.
  2. Failisisend: getchar töötab nii standardse sisendi kui ka failide lugemisel – failide sisestuse õppimine laiendab võimalusi.
  3. Veakontrolli praktika: korrektselt käidelda sisestusvigu (EOF või vigane sisestus), et programm oleks töökindel.

C-keele põhitõdede omandamisel aitab nende teadmiste süvendamine luua praktilisi ja usaldusväärseid programme.

年収訴求