Yritän tehdä todella yksinkertaista sanakirjaohjelmaa. Tarkoituksenani on että käyttäjä voi kirjoittaa sanan suomeksi tai englanniksi ja ohjelma tulostaa vastinparin esim. jos käyttäjä kirjoittaa auto niin pitäisi tulostua car ja toisinpäin käyttäjä kirjoittaa car niin pitäisi tulostua auto.
Itse sanakirja on tekstitiedosto, josta sanat luetaan ohjelmaan. Koska tarkoitukseni on tehdä yksinkertainen ohjelma ovat sanat tiedostossa eri riveillä.
esim. testi.txt
auto
car
auto
Ylläolevalla tavalla voin etsiä sanaa tiedostosta ja jos se löytyy tulostetaan seuraavarivi, näin menetellen jos kirjoitan auto tulostuu car ja jos kirjoitan car niin tulostuu auto. Tuolla tavalla saan aikaiseksi hyvin yksinkertaisen sanakirjan.
Ainoa ongelma on, että alla olevassa koodissani on jotain vikaa kun ei toimi. Olen yrittänyt mietiskellä missä mättää...tuloksetta.
#include <stdio.h> #include <string.h> //SANAKIRJA: Tarkoituksenani on, että kysytään sana käyttäjältä ja etsitään sitten sanaa //tiedostosta jos sama sana löytyy tulostetaan seuraava rivi tiedostosta //eli jos annat sanan hiiri ja se löytyy tulostuu vastinpariksi mouse //ja jos annat mouse tulostuu hiiri //tiedosto testi.txt /* auto car auto */ int main(void) { char sana[20]; char vertaus[20]; char seuraavaRivi[80]; int i; int j; int pituus; FILE *auki; printf("Anna sana suomeksi tai englanniksi :\n"); scanf("%s",&sana); auki=fopen("C:\\omatTreenit\\testi.txt","r"); if((auki=fopen("C:\\omatTreenit\\testi.txt","r"))==NULL) { printf("En voi avata tiedostoa"); } fgets(seuraavaRivi,80,auki); pituus=(int)strlen(seuraavaRivi); //saadaan kopioitua sanat muuttujiin? strcpy( vertaus,seuraavaRivi); fgets(seuraavaRivi,80,auki); //tarkistetaan sanat!! ihan testausta varten printf("Tiedostosta %s\n",vertaus); printf("Annettu %s",sana); //jos sanat ovat samat niin tulostetaan seuraavarivi if(strcmp(sana,vertaus)==0) { for(i=0;i<pituus;i++) { printf("%c",seuraavaRivi[i]); } else printf("Eipas loytynyt vastinparia!"); return(0); }
valitettavasti tuo ohjelma voi toimia vain windowsissa :|
scanf("%s", &sana); // Väärin scanf("%s", sana); // Oikein scanf("%19s", sana); // Vielä oikeammin; nyt sanaan tungetaan enintään 19 merkkiä + \0
Ok Metabolix, mutta mikä tuossa koodissa mättää kun ei toimi?
Olen aloittelija ja yritän tehdä tuon sanakirja ohjelman mahdollisimman yksinkertaisesti.
Olisin kiitollinen kaikesta avusta.
No ainakin juuri tuo scanf("%s", &sana);
korjasin se, ei vaikuttanut.
Eli tuo ei jostain syystä tulosta seuraavaa riviä tiedostosta, vaikka sanat ,käyttäjän antama ja tiedoston ensimmäisen rivin sanat ovat samat.
En siis millään keksi mikä tuossa koodissa mättää :(
Kopioinpa tuon koodin editoriin, ja kas kummaa, eihän se edes käänny. Puuttuu viimeisestä if-lauseesta yksi aaltosulku ennen elseä.
Tällainenkin virhe löytyy:
auki=fopen("C:\\omatTreenit\\testi.txt","r"); if((auki=fopen("C:\\omatTreenit\\testi.txt","r"))==NULL) { printf("En voi avata tiedostoa"); }
Avaat tiedoston kaksi kertaa. Poista jompikumpi. Lisäksi tuosta virheilmoituksesta huolimatta ohjelman suoritus jatkuu. Kannattanee lisätä printf:n jälkeen return 0
.
Oikeinhan tuo ohjelma toimii muilta osin, mutta vertaus-muuttujan lopussa on ylimääräinen \r-tavu, joten vertailu antaa "väärän" tuloksen. Pitäisi jonkun tosiaan kirjoittaa perusopas ohjelman debuggauksesta, niin ei tulisi enää näin helposti selviäviä ongelmia. Tunhan selviää ihan printtaamalla jokaisen tavun lukuarvo ruudulle, jolloin näkee, että 'vertailu' sisältää sen yhden 10-tavun enemmän. Ennen kuin kysyt, miksi ohjelma vain välähtää loppuun sanan antamisen jälkeen, vastaan, että aja se komentoriviltä, niin näet tulosteen.
No kyllä se kaari sulku siellä oli, mutta näköjään tänne pistämästäni koodista puuttui. Ja eikös tuo toinen vaan tarkista, että voiko sitä tiedostoa ylipäätään avata. No ihan kyllä olen ajanut komentoriviltä ja hyvin toimii paitsi tuo vertailu. Eikä todellakaan "välähdä loppuu".
Siis mitä tarkoitat tuolla ylimääräinen \r tavu, niin ja varmaankin itsekkin olet joskus ollut aloittelija.
Kuten saatat ehkä tietää, kaikkea tietoa käsitellään enemmän tai vähemmän tavuina. Teksti on vain merkkejä peräkkäin, ja jokainen merkki on yhden tavun kokoinen. Lisäksi teksti sisältää erikoismerkkejä, kuten rivinvaihdon, joka Windowsissa koostuu kahdesta tavusta, 10 (voidaan merkitä C:ssä '\r') ja 13 (voidaan merkitä C:ssä '\n'). Tarkoitan, että kun sana Auto on muistissa tavuina, käyttäjän syöttämä sana sisältää merkit A, u, t ja o, kun tiedostosta luettu sisältää näiden lisäksi merkin \r. Tuo merkki pitää siis poistaa, jotta vertailu toimisi. Suosittelen, että poistat tuon merkin hyödyntämällä sanan pituutta (tuossa tapauksessa 5, koska kirjainten Auto lisäksi on tuo viides merkki), jolloin saat muutettua viimeistä merkkiä (pituus - 1). Laita siihen tavu 0 eli '\0', niin vertailufunktio katsoo sanan loppuvan siihen.
Oletkos lukenut mitään kunnon C-opasta? Yleensä niissä selitetään tavalla tai toisella tällaiset asiat.
Aihe on jo aika vanha, joten et voi enää vastata siihen.