Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Köyhän miehen suojaus-ohjelman ongelma

Sivun loppuun

Juice [29.06.2004 22:08:47]

#

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);
}

Metabolix [29.06.2004 22:49:26]

#

If pitää aina kirjoittaa pienellä: "if"
Kuten myös kaikki muut nuo varatut sanat (if, else, switch, case ... ... ...)

Antti Laaksonen [29.06.2004 22:51:33]

#

Lisäksi merkkijonoja ei voi vertailla noin, vaan täytyy käyttää erillistä strcmp-funktiota. Lisätiedot C-oppaassa.

firebug [30.06.2004 00:10:12]

#

Ohjelmassa on myös mahdollista tapahtua muistivuoto, jos käyttäjä syöttää merkkejä enemmän kuin ansvariin mahtuu(eli yli 7).

Ande [30.06.2004 00:14:49]

#

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.

Metabolix [30.06.2004 00:16:38]

#

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.

Deffi [30.06.2004 02:35:49]

#

main() :D
Toi on maailman oudoin tapa määritellä pääfunktio

vipemype [30.06.2004 12:03:49]

#

Ja scanf()-funktion lopusta puuttuu ;

tn [30.06.2004 21:55:57]

#

Eikö scanf-funktiolle muka pidä välittää osoitinta merkkijonoon, eikä osoitinta merkkijonon osoittimeen. Eli mitä &-merkki tekee kyseisellä rivillä?

Juice [30.06.2004 22:02:50]

#

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;
}
}

tn [30.06.2004 22:11:48]

#

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.

thefox [04.07.2004 23:04:09]

#

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.

tn [05.07.2004 17:04:36]

#

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?

hunajavohveli [05.07.2004 17:33:59]

#

No eikö se taulukko tavallaan osoitin ole, mutta sitä vain pystyy käsittelmään helpommalla syntaksilla?

sooda [05.07.2004 17:37:28]

#

On se. http://www.funet.fi/c opas/osoittimet.html#ap

Juice [05.07.2004 20:30:55]

#

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.

Metabolix [05.07.2004 23:13:30]

#

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.

Juice [05.07.2004 23:22:12]

#

Hmm... salasanan peittämistä tässä vaan suunnittelen. Olisiko jollakulla ideaa, miten voisi toteuttaa? On varmasti muillakin mielessä.

Tiedän, oli jo topikkina

Antti Laaksonen [06.07.2004 01:37:24]

#

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;
}

thefox [06.07.2004 02:32:38]

#

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 :)

tn [06.07.2004 14:33:20]

#

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.

Metabolix [06.07.2004 19:15:47]

#

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.

Antti Laaksonen [06.07.2004 20:33:48]

#

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.

Metabolix [06.07.2004 20:49:05]

#

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]

Juice [06.07.2004 22:58:06]

#

Laitappa Antti tuo koodisi koodivinkkeihin. Olisi siten suuremman yleisön saatavilla.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta