Muuttujalle voidaan sijoittaa uusi arvo myös C- kielen scanf- funktiolla. Funktion kutsussa on kaksi osaa: ohje- eli format - osa ja lista muuttujien osoitteista, joihin arvot sijoitetaan. Matka olisi voitu lukea myös kutsulla:
scanf("%d",&matka_mm);
Tässä "%d" tarkoittaa, että kutsun listaosassa vastaavassa paikassa oleva muuttuja on tyyppiä d eli desimaalinen (annetaan 10- järjestelmässä) kokonaisluku.
&matka_mm tarkoittaa muuttujan matka_mm osoitetta. Funktiolle ei voida viedä parametrinä itse muuttujan arvoa, koska funktio ei tämän perusteella tiedä mihin se luetun arvon sijoittaisi. Tämän takia välitämmekin muuttujan osoitteen, eli sen paikan muistissa, missä muuttujan arvo sijaitsee. Näin aliohjelma tietää sen mihin paikkaan arvo tulee sijoittaa.
Varoitus! Yleinen virhe on unohtaa &- merkki pois scanf- funktion kutsusta.
Joissakin ohjelmointikielissä (kuten Pascal tai Fortran ja osittain myös C++:ssa) ei osoitemerkkiä kirjoiteta, koska kääntäjä kääntää vastaavat kutsut siten, että parametrinä viedäänkin osoite. C- kielessä on mahdollista välittää vain arvoja parametrinä.
int pituus,leveys; printf("Anna kentän pituus ja leveys metreinä >"); scanf("%d %d",&pituus,&leveys);
Koska kyseessä on funktio, niin se myös palauttaa jonkin arvon. Tässä tapauksessa palautetaan kokonaislukuarvo, joka kertoo montako onnistunutta sijoitusta pystyttiin tekemään.
/* ala.c */ /* Ohjelmalla luetaan kentän leveys ja pituus sekä tulostetaan näiden perusteella kentän ala. Tietoja kysytään kunnes molemmat tulevat oikein annetuksi. Vesa Lappalainen 18.9.1991 */ #include <stdio.h> int main(void) { int pituus,leveys; do { printf("Anna kentän pituus ja leveys metreinä >"); fflush(stdin); /* Poistetaan mahd. ed. kier. ylim. merkit, epästd. */ } while ( scanf("%d %d",&pituus,&leveys) < 2 ); printf("Ala on %d m2.\n",pituus*leveys); return 0; }
format- osassa voidaan pakottaa syöttämään tiettyjä merkkejä syöttötekstin väliin:
scanf("%d,%d",&pituus,&leveys)
Tällöin syöttöjä saataisiin seuraavasti:
Syöttö:
|
syöttöjen
lkm
|
pituus
|
leveys
|
|
23,34
|
2
|
23
|
34
|
|
23, 45
|
2
|
23
|
45
|
|
23
34
|
1
|
23
|
alkup.
|
|
23
,34
|
1
|
23
|
alkup.
|
|
,34
|
0
|
alkup.
|
alkup.
|
|
|
odottaa
lisää
|
|
|
|
34
|
1
|
34
|
alkup.
|
|
kissa
|
0
|
alkup.
|
alkup.
|
|
Näin voitaisiin lukea esimerkiksi mittakaava:
printf("Anna mittakaava muodossa 1:2000 >"); scanf("1:%lf",&mittakaava);
tai jopa:
printf("Anna mittakaava muodossa 1:2000 >"); scanf("%lf:%lf",&kerroin,&mittakaava);
Mikäli syöttö on formaattiin nähden väärää muotoa, jäävät ne muuttujat alkuperäiseen arvoonsa, jotka ovat virheellisen syöttökohdan jälkeen. Esimerkiksi
scanf("1:%lf",&mittakaava);
palauttaa 0 ja jättää mittakaava - muuttujan arvon koskemattomaksi, mikäli syöttö alkaa millä tahansa muulla kuin 1:.