printf kasutamine

Järgnevalt on toodud välja mitmeid näiteid erinevatest printf funktsiooni kasutusest. Kõiki koodinäiteid soovitan kopeerida ning proovida enda arvutis, kasutades selleks kopeerimise tööriista tekstikasti ülaosas. Mitmete koodinäidete puhul on toodud ka esile tegevusi, mida ei tasuks teha koos soovituste ja alternatiivsete lahendustega. Näite juurde kuulub reeglina selgitav kommentaar.

Lihtteksti kuvamine

printf() funktsioonil pole omane vahetada automaatselt rida millele teksti kuvatakse.  Reavahetus tuleb käsitsi sisse kirjutada kasutades erisümbolit \n. Alternatiivina on võimalik ka kasutada funktsiooni puts().
Käsureaprogrammide puhul on oluline ka viimase trükitava rea järele panna reavahetus. Programmi lõppedes seda automaatselt ei tee ning see võib tekitada segadust tulemusest arusaamisel kui programm käivitatakse otse käsurealt.
Reavahetusi võib ühe funktsiooni väljakutse sisse pookida mitmeid.
Alternatiivina saab kasutada ka funktsiooni puts(). Funktsiooni puts() teeb eriliseks see, et ta on mõeldud vaid lihtteksti kuvamiseks ilma mingisuguse formaadita – st me ei saa nt panna teksti sisse muutujatest väärtusi. Küll aga on reavahetused automaatsed.

Muutujatest väärtuste trükkimine

Väärtuste kuvamine on iseenesest elementaarne tegevus, milleks piisab vaid teadmisest mis andmetüüpi me soovitud väärtus omab, kuhu me ta paigutada soovime ning kus ta asub.

Esimese näitena kuvame ühe reaga kahe erineva muutuja väärtused. Oluline on jälgida, et kõik formaadid oleksid valitud õigesti (nt %d täisarv, %s tekst) ning muutujad kust väärtusi otsitakse oleksid komadega eraldatud ning õiges järjekorras. Muutujate väärtusi paigutatakse teksti sisse vasakult paremale vastavalt kohtadesse mis on selleks ette nähtud. Eksides tüübiga või järjekorraga saad kas kompilaatorilt hoiatava veateate või kuvatakse vigane tulemus programmi käivitamisel.

Keerulisem on olukord murdarvudega. Sageli on nende esitustäpsust mõistlik piirata, et väljund jääks kasutajale mõistetavaks.

Samuti tasub olla ettevaatlik ka murdarvude esitamistäpsusega – arvutid ei ole võimelised kõiki murdarve täpselt esitama. Abiks taaskord kas täpsuse määramine või siis juba täpsema andmetüübi kasutamine (nt double) või arvude täisarvudena hoiustamine ning vajadusel teisendamine.

Polsterdamine ja joondamine

Sageli tekib olukordi, kus numbri kuvamine teksti sees ei anna soovitud tulemust ning hea oleks neid kuvada tabeli kujul või siis vähemasti joondatuna.

Kasutades \t ehk tabulaatorit saame tekitada mingisuguse eralduse. Pilt pole küll kõige ilusam aga vähemalt tulbad on nähtavad.

Küll aga pole taoline lahendus sageli sobilik. Probleemid tekivad koheselt kui ühe tulba väärtuse pikkus erineb teistest sedasi, et ei mahu enam ühe tabulaatori vahe sisse (loetakse vasakult 4-kaupa). Valisime siia ühe pikema nime ning näeme, et joondus enam paika ei pea.

Vaatame siin ühte võimalikest lahendustest kus on mitmeid vorminduselemente lisatud. Samuti lisasime tulba palkade jaoks.

  • Esiteks siis fikseerime ära mitu tähemärgi iga välja jaoks jääb – nt %13s, %3d, %6d. See ütleb, et antud välja jaoks peab alati olema niimitu tähemärki ruumi. Kui sisestatav väärtus on lühem, siis vasakule jääb tühi ruum.
  • Teiseks kasutame teksti vormindamiseks miinusmärki formaadis (%-13s). Miinusmärk ütleb, et antud teksti tuleks joondada vasakule, mitte paremale. Tavaliselt soovime me, et tekst oleks joondatud vasakule ning numbrid paremale.
  • Kolmandaks näeme formaati %06d, mis tähistab, et arvule jäetakse 6 tähemärki ruumi aga kui arvu on lühem sellest, siis tühjad kohad täidetakse nullidega.
  • Neljandaks vaatame murdarvu formaati (%5.2f. Sunnime murdarvu alati näitama kahte komakohta, isegi kui need olid nullid. Selleks on number punkti järel. Teiseks on punkti ees samuti number. See ütleb mitu tähemärki kogu numbri kuvamiseks kuulub koos eraldajaga.

Kasulikke trikke

Pealkirjade lisamiseks tabelitesse tasub kasutada samuti joondamisel vaadeldud trikke paigutuseks ja tähemärkide arvuks. C programmis pole oluline kas komaga on järgi pandud mõni muutuja või konstant. Paneme oma päiste nimetused komadega järgi ning määrame neile kohad formaadis.

Lahendus on juba üsnagi muljetavaldav. Küll aga on probleemideks siiski välja pikkuse muutumine. Praegu on vaja muudatus teha korraga kahes kohas, et see kehtiks üle tabeli – nii päises kui infoväljades. Praktikas saaks teha seda ka veidike paremini.

Välja pikkust on võimalik C puhul anda eraldi konstandina või muutujaga. Selleks tuleb fikseeritud numbri asemel panna formaadi keskele tärni (*). Sellisel juhul otsib kompilaator seda pikkust pärast formaadi lugemist, eraldatuna komaga, enne välja sisu. Antud juhul määrasime programmis mitmed konstandid, mis ütlevad kui pikk üks või teine väli peab olema. Nüüd saame neid muuta vaid ühest kohast ja muudatus kehtib kõikjal, kus me seda kasutame.

Järgmine samm sellest võiks olla kuidas teha kas veerud dünaamiliselt laienevaks või liigpikkade nimede puhul neid lühendada. Esimesel juhul on vihjeks kõigist tulpa kuvatavate väärtuste eelnev kontrollimine pikima leidmiseks ning teisel juhul võib abiks olla tähemärkide ükshaaval trükkimine kuniks ruumi on.

Samuti juhin tähelepanu, et koodimisstiili huvides lõime need eraldi ridadele lahku.