Yritän opiskella C:tä eräästä kirjasta, mutta en saa erästä kirjan esimerkkikoodia toimimaan. Koodin tarkoituksena on käsittääkseni juurikin annettujen merkkien laskenta.
#include <stdio.h> main(){ double nc; for(nc=0; getchar()!=EOF; ++nc); printf("%.0f\n", nc); }
Koodi on suoraan kopioitu kirjasta, mutta ajettaessa ohjelma ei itselläni tee mitään.
Osaisiko joku valaista minua tässä ongelmassa?
Suosittelen vaihtamaan kirjaa melko nopeasti, koska mikäli esimerkkikoodi on noin epästandardia, niin mikähän mahtaa opuksen painoarvo nykyään? Mitä kääntäjäsi mainitsee virheiksi? Kannattaa ainakin tutustua putkan C-oppaaseen.
Koodi laskee merkkejä, kunnes tulee EOF, siis tiedoston loppu. Tämän saat aikaan Linuxissa yhdistelmällä Ctrl+D ja Windowsissa yhdistelmällä Ctrl+Z. Jos ohjaat syötteen tiedostosta, ohjelma laskee oikein. Ajokomento (komentorivillä) näyttää silloin tältä:
ohjelma.exe < syote.txt
Jos haluat laskea merkkejä yhdeltä riviltä, laita EOFin tilalle '\n' eli rivinvaihto.
Kuten Teuro sanoi, koodi on vähintäänkin rumaa. Tässä on muutama korjaus:
C:ssä pääfunktion oikea tyyppi on jompikumpi näistä:
int main(void)
int main(int argc, char **argv)
Jälkimmäinen sallii komentoriviparametrien käyttämisen.
Määrään kannattaisi käyttää jotain kokonaislukutyyppiä (esimerkiksi int), ja siinä sivussa tulostukseenkin pitäisi valita oikea formaatti (esimerkiksi %d).
Operaattorien ympärillä kannattaisi selkeyden vuoksi käyttää välejä. Vertaa:
for(i=0,j=5;getchar()!=EOF;++i,--j)
for (i = 0, j = 5; getchar() != EOF; ++i, --j)
Tämä on toki mielipidekysymyskin. Tiivis koodi ei ole koskaan itseisarvo nykyään, kun kovalevylle kyllä mahtuu pari ylimääräistä välilyöntiäkin, ja toisaalta aika on rahaa, joten helppolukuinen koodi maksaa itsensä takaisin.
Siististi ohjelma näyttäisi tältä:
#include <stdio.h> int main(void) { unsigned int maara = 0; while (getchar() != EOF) { ++maara; } printf("%u\n", maara); return 0; /* Ei ole C99-standardin mukaan tarpeen. */ }
Laita kirjoittajan nimi mieleen ja kierrä kyseisen henkilön opukset kaukaa. Itse olen törmännyt suomalaisten tekijöiden teoksissa vastaavaan laadun puutteeseen. Ilmeisesti täällä saa julkaista ihan mitä tahansa sontaa. ISBN:llä 951-826-589-5 löytyy kamalin c-opus mitä olen eläissäni nähnyt. Kirjalla ei ole minkäänlaista arvoa ja se on kannesta kanteen täynnä virheitä.
Tietysti pätkä on tässä irrotettu kontekstistaan ja me emme tiedä mitä esimerkistä sanotaan, mutta oletan että kirjan kirjoittaja pitää ohjelmaansa hyvänä. Sinänsä mainin paluuarvon tyypin poisjättäminen ei ole virhe, koska c:ssä funktiot palauttavat oletusarvoisesti intin, ellei eksplisiittisesti ole toisin sanottu. Hyvien ohjelmointitapojen vastaista se on. Samasta syystä lisäisin Metabolixin esimerkkiinkin return 0; tuonne loppuun.
Muuten ohjelma on hyvä tehdä juuri noin kun Metabolix neuvoi. Mieluummin kuitenkin määrän tyypiksi unsigned int, koska kyseessä kuitenkin on positiivinen kokonaisluku. Doublen käytössä tähän tarkoitukseen ei ole kuin pelkästään haittaa. Toimiihan se tietysti niinkin, mutta joissain tapauksissa doublet laskee väärin ja 1.0+1 ei olekaan 2.0. Ja muutenkin float laskut on raskaampia kuin integer laskut.
Suuri kiitos teille vastauksistanne. Sain ohjelman toimimaan kunnolla ja ongelmana olikin juuri tuo, etten tiennyt, että ajaessani koodia minun tulee painaa Ctrl+D lopuksi.
Täytyykin katsella, jos silmiini osuisi jossain parempi C-ohjelmointikirja.
Aihe on jo aika vanha, joten et voi enää vastata siihen.