Elikkä mulla ois tälläinen ohjelma, joka kysyy salasanaa ja sitten kun se menee oikein niin se avaa Mozilla Thunderbirdin, mutta...
En ole hyvin kokenut C:ssä tai C++:ssa. Tulee tällaisia virheilmoituksia:
[warning] in function `int main()';
Ja rivillä 10 herjaa:
parse error before`('token
Kummallista ja outoa. Voisitteko kenties auttaa?
(Tiedän sitten kyllä että suojaus ei ole hääppöinen, mutta Inboxista muuten muut pääsee lukemaan viestit... Eivätkä he tiedä missä on thunderbird.exe)
#include <windows.h> #include <stdio.h> main() { char ansvar[7]; char devi[7] = "passwd"; printf("Anna salasana!"); scanf("%s", &ansvar) If (ansvar == devi) ShellExecute(NULL, "open", "C:/Program Files/Mozilla Thunderbird/thunderbird.exe", NULL, NULL, SW_SHOWNORMAL); }
If pitää aina kirjoittaa pienellä: "if"
Kuten myös kaikki muut nuo varatut sanat (if, else, switch, case ... ... ...)
Lisäksi merkkijonoja ei voi vertailla noin, vaan täytyy käyttää erillistä strcmp-funktiota. Lisätiedot C-oppaassa.
Ohjelmassa on myös mahdollista tapahtua muistivuoto, jos käyttäjä syöttää merkkejä enemmän kuin ansvariin mahtuu(eli yli 7).
firebug kirjoitti:
Ohjelmassa on myös mahdollista tapahtua muistivuoto, jos käyttäjä syöttää merkkejä enemmän kuin ansvariin mahtuu(eli yli 7).
Ei muistivuoto, vaan buffer overflow. Muistivuoto tarkoittaa sitä, kun jättää vapauttamatta varaamaansa muistia.
Itse laittaisin näin:
bool Oikea = true; for (int x = 0; x < 7; x++) if (ansvar[x] != devi[x]) Oikea = false;
Eli käydään kaikki kirjaimet läpi, ja jos jokin on eri kuin alkuperäisessä, koodi ei ole oikein.
main() :D
Toi on maailman oudoin tapa määritellä pääfunktio
Ja scanf()-funktion lopusta puuttuu ;
Eikö scanf-funktiolle muka pidä välittää osoitinta merkkijonoon, eikä osoitinta merkkijonon osoittimeen. Eli mitä &-merkki tekee kyseisellä rivillä?
Sain koodin toimimaan, kiitos teille. &-merkki on kyllä välttämätön tuolla rivillä. Ohjelmaanhan keksisi parannuksia ties kuinka paljon, mutta välttää se minulle tällaisena. Ainakin se toimii. Alla on vielä koko koodi, jos joku sitä vaikka sattuisi tarvitsemaan.
#include <windows.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { char ansvar[7]; char devi[7] = "passwd"; printf("Anna salasana!"); scanf("%s", &ansvar); bool Oikea = true; for (int x = 0; x < 7; x++) if (ansvar[x] != devi[x]) Oikea = false; if (Oikea != false) ShellExecute(NULL, "open", "C:/Program Files/Mozilla Thunderbird/thunderbird.exe", NULL, NULL, SW_SHOWNORMAL); if (Oikea = false) { printf("Salasana väärin"); system ("pause"); return 0; } }
lainaus:
&-merkki on kyllä välttämätön tuolla rivillä.
No se oli vain arvelu, sillä en muista käyttäneeni kyseistä funktiota kertaakaan, vaan käytän sen tilalta c++ :n cin-oliota.
Itseasiassa tuollaisen taulukon ollessa kyseessä 'ansvar' ja '&ansvar' ajavat saman asian, '&'-merkki ei siis ole välttämätön. Sen sijaan jos kyseessä olisi esimerkiksi char-pointteri (char *), niillä olisi eri merkitys.
Mitä? Eikö taulukko olekkaan osoitin? Jossakin c/c++ -oppaassa ainakin väitettiin niin. Miten ne eroavat toisistaan ja kumpaa tapaa tuossa olisi pitänyt käyttää, jos se olisi ollut osoitin?
No eikö se taulukko tavallaan osoitin ole, mutta sitä vain pystyy käsittelmään helpommalla syntaksilla?
Vielä tällaista kysyisin, en kehdannut uutta topikkia aloittaa: Miten saa liitettyä fontin scanf-funktioon - eli kun kirjoitetaan niin se näkyy jollain tietyllä fontilla.
Dossissa ei tietääkseni saa muutettua fonttia. (Vai oletko koskaan nähnyt muita fontteja Dossissa?) Oman fontintapaisen saisi aikaan vain, jos osaisi tehdä graafisen ohjelman.
Hmm... salasanan peittämistä tässä vaan suunnittelen. Olisiko jollakulla ideaa, miten voisi toteuttaa? On varmasti muillakin mielessä.
Tiedän, oli jo topikkina
Oikean DOSin fonttia voi vaihtaa, mutta komentoikkunassa näkyvä fontti on kyllä Windowsin päättämä. Salasanan peitto varmaan tarkoittaa sitä, että kirjainten tilalla näkyy vaikka tähtiä. Tein nyt tällaisen pikku ohjelman, joka näyttää kirjoitetun salasanan tähtimerkkeinä. Salasanan korjaus toimii, ja vähällä vaivalla saa vaikka pituusrajoituksen.
#include <stdio.h> int main(void) { char salasana[20], merkki; int kohta; /* kysytään salasanaa ja alustetaan kohtalaskuri */ printf("Kirjoita salasana: "); kohta = 0; /* luetaan merkkejä, kunnes käyttäjä painaa Enteriä */ merkki = getch(); while (merkki != 13) { /* jos käyttäjä poistaa edellisen merkin, vähennetään kohtalaskuria ja poistetaan edellinen merkki näytöltä */ if (merkki == 8) { if (kohta > 0) { kohta--; printf("%c%c%c", 8, 32, 8); } /* muussa tapauksessa lisätään uusi merkki merkkijonoon, kirjoitetaan se näytölle ja kasvatetaan kohtalaskuria */ } else { salasana[kohta] = merkki; printf("*"); kohta++; } merkki = getch(); } /* lopuksi laitetaan merkkijonon lopetukseksi nollamerkki, ja näytetään äsken peitettynä kirjoitettu sana */ salasana[kohta] = '\0'; printf("%s", salasana); return 0; }
Ja kaiken tämän keskellä muistetaan että jossain olisi hyvä tarkistaa meneekö ettei kirjoitella salasana-puskurin ulkopuolelle :) Varsinkin kun kyseessä on esimerkki :)
tn: jos se olisi ollut osoitin, ei olisi käytetty & merkkiä ellei nimenomaan olisi haluttu lukea arvoa sille osoittimelle :)
fawkz kirjoitti:
tn: jos se olisi ollut osoitin, ei olisi käytetty & merkkiä ellei nimenomaan olisi haluttu lukea arvoa sille osoittimelle :)
Noinhan olen sen aina ymmärtänytkin, mutta en vieläkään tajunnut, miten asiaa muuttaa se, että merkkijono onkin määritelty taulukkona. Tuossa soodan osoitteessahan (juuri tuota opasta tarkoitin edellisessä viestissä) nimenomaan sanotaan, että taulukko on osoitin, joten eikö senkin silloin pitäisi toimia samalla tavalla.
Antti Laaksonen kirjoitti:
Oikean DOSin fonttia voi vaihtaa, mutta komentoikkunassa näkyvä fontti on kyllä Windowsin päättämä.
DOSin fontin vaihtaminen ei taida olla ihan pikkujuttu. Oikaiskaa jos olen väärässä. Koon muuttaminen on toki asia erikseen.
DOS-fontti vaihdetaan kutsumalla keskeytystä 10h niin, että AH-rekisteri on 11h ja AL-rekisteri on 10h. Sitä ennen laitetaan muistiin muutettavat merkit tietyssä muodossa. Lisätietoja löytyy vaikkapa HelpPC:stä ja tein myös kerran kyseistä keskeytystä käyttävän QBasic-ohjelman, joka lisää DOSin merkistöön euromerkin.
Kylläpä tuo oli QB:llä helpon näköistä... Mutta kaikkipa eivät osaakaan edes QB:tä, saati sitten assemblyä.
[offtopic]
Jos haluaa nykyään (siis windowsissa / linuxissa) muokata ruudun sisältöä assemlyllä, pitääkö se tehdä HDC:n tai HBITMAPin kautta ja osoittaa vaan suoraan oikeaan kohtaan sitä muistissa? En tuota HDC:n rakennetta tunne, joten HBITMAP voi olla minulle turvallisempi... Muistan vaan pelin nimeltä Threat, jonka kaikki efektit toimivat hyvin liukkaasti jopa 286:lla vaikka itse saisin Windowsin kanssa jo tapella että saisin vastaavaa aikaan.
[/offtopic]
Laitappa Antti tuo koodisi koodivinkkeihin. Olisi siten suuremman yleisön saatavilla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.