1. Mis on scanf
funktsioon?
C-keele õppimisel kasutatakse sageli scanf
funktsiooni, et sisestada andmeid programmi. See toimib nagu „kuulaja“, kes võtab kasutajalt sisendi vastu ja salvestab selle määratud muutujasse.
scanf
põhisüntaks
scanf("formaadistring", &muutuja);
Oluline on siin „formaadistring“ ja &
, mis lisatakse muutuja ette. Formaadistring määrab sisestatava andmetüübi ja &
viitab muutuja mäluaadressile. Selle lihtsa reegli järgimisel saab scanf
töödelda kasutajasisestust programmis.
Näiteks täisarvu lugemiseks kasutatakse järgmist koodi:
int num;
scanf("%d", &num);
Nagu näha, võimaldab see programmile sisestada andmeid ja kasutada neid kohe. scanf
on tõepoolest usaldusväärne partner C-keeles andmete sisestamisel.

2. Sageli kasutatavad formaadistringid
scanf
on eriti mugav, kuna suudab töödelda erinevat tüüpi andmeid. Formaadistringide abil saab programmile öelda, millist tüüpi andmeid oodatakse. Vaatame nüüd mõningaid sagedamini kasutatavaid formaadistringe.
Peamised formaadistringid
%d
: Täisarvude jaoks.%f
:float
-tüüpi ujukoma arvude jaoks.%lf
:double
-tüüpi kahekordse täpsusega ujukoma arvude jaoks.%s
: Sõnesid (stringe) jaoks (märkuseks: ei käsitle tühikuid).%c
: Üksikute märkide jaoks.
Näiteks, kui kasutaja sisestab ujukoma arvu ja see tuleb salvestada double
tüüpi muutujasse, kirjutatakse see nii:
double val;
scanf("%lf", &val);
Siin on oluline meeles pidada, et %lf
on mõeldud kahekordse täpsusega ujukoma arvudele. Sellisel viisil formaadistringide kasutamine võimaldab scanf
abil töödelda erinevaid andmetüüpe.
3. Mitme sisendi korraga töötlemine
Mõnikord on vaja kasutajalt korraga mitut sisendit saada. Näiteks kui soovid sisestada vanuse ja pikkuse ühel ajal. Sellisel juhul saab scanf
abil kasutada mitut formaadistringi ja töödelda neid korraga.
int age;
float height;
scanf("%d %f", &age, &height);
Nii saab ühekorraga sisestada vanuse (täisarv) ja pikkuse (ujukoma arv).
Kui soovid neid väärtusi programmis kuvada, saab kasutada järgmist koodi:
printf("Vanus: %d, Pikkus: %.2f", age, height);
Selle abil saab sisestatud andmed hõlpsasti kuvada. Mitme sisendi haldamine on tehtud lihtsaks ja kiireks!

4. Sisendi valideerimine ja veakäsitlus
Kasutajad ei sisesta alati korrektseid andmeid. Tuleb arvestada olukordadega nagu „vigane vanus“ või „negatiivseid väärtusi ei aktsepteerita“. Sellistes olukordades tulevad appi valideerimine ja veakäsitlus.
Vigade kontrollimine scanf
tagastusväärtuse abil
scanf
tagastab sisestatud väärtuste arvu, mida saab kasutada sisendi kontrollimiseks. Järgnevas näites kontrollitakse, kas vanus jääb vahemikku 0–120:
int age;
printf("Palun sisesta oma vanus (0–120): ");
if (scanf("%d", &age) == 1 && age >= 0 && age <= 120) {
printf("Sisestatud vanus on %d aastat.\n", age);
} else {
printf("Vigane vanus.\n");
}
Selles koodis kasutatakse scanf
tagastusväärtust, et kontrollida, kas sisend on õiges vormingus, ning kas vanus jääb lubatud piiridesse. See aitab vältida vigaseid sisestusi ja luua töökindlama programmi.
5. Sisendvoo puhastamine
Kui kasutad scanf
-i, võib mõnikord juhtuda, et „kas eelmine sisestus jäi alles?“. See tekib siis, kui sisendvoogu on jäänud andmeid – näiteks Enter
klahvi vajutamisel tekkinud reavahetusmärk (newline).
Sisendvoo puhastamiseks kasuta järgmist koodi:
scanf("%*[^
]");
scanf("%*c");
See aitab eemaldada ülejäänud sisendi ja vältida selle mõju järgmisele sisestusele. Kui teed sellest harjumuse, väldid ootamatuid vigu ja muudab koodi töökindlamaks.

6. Levinumad vead ja parimad tavad
scanf
-i kasutamisel tehakse alguses tihti vigu. Näiteks kasutatakse kogemata %s
asemel %d
, või unustatakse muutuja ette &
. Need vead põhjustavad kiiresti tõrkeid, kuid neid saab teadlikult vältida.
Parimad tavad
- Vastavus formaadistringile:
%d
tuleks kasutadaint
tüüpi jaoks,%f
agafloat
tüüpi jaoks jne – kasuta alati õiget formaati. - Pööra tähelepanu sõne pikkusele: pikkade stringide sisestamisel tuleb vältida puhvri ületäitumist (buffer overflow).
- Sisendvoo puhastamine: nagu eelnevalt mainitud, hoia sisendvoog alati puhtana, et vältida soovimatuid sisestusi.
Neid nõuandeid järgides saab tagada stabiilse sisendi töötlemise ja vältida ootamatuid vigu.
7. Edasijõudnud kasutusvõtted|scanf
funktsiooni täiustatud kasutamine
Lõpuks vaatame mõningaid edasijõudnud viise, kuidas scanf
-i kasutada. Näiteks kui soovid sisestada väärtusi mitmesse muutujasse korraga või sisestada sõne massiivi.
Sisendi lugemine sõne (stringi) muutujasse
char name[20];
printf("Palun sisesta oma nimi: ");
scanf("%s", name);
printf("Tere, %s!", name);
Selles näites luuakse lihtne programm, mis küsib kasutajalt nime ja tervitab teda. Sisestatud nimi salvestatakse massiivi name
, mida kuvatakse %s
formaadistringi abil.
Kokkuvõte
scanf
on C-keeles väga võimas tööriist, mis võimaldab erinevate andmevormide sisestust. Kui seda õigesti kasutada, saab sellega edukalt hallata kasutajalt sisestatavaid andmeid. Selle juhendi abil saad õppida scanf
-i tõhusalt kasutama oma programmis.
Oluline on:
- kasutada sobivaid formaadistringe,
- kontrollida sisestusvigu,
- ja puhastada sisendvoog enne järgmist sisestust.
Kui need põhialused on selged, muutub scanf
võimsaks vahendiks sinu programmeerimisoskuste arsenalis!