Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ongelmia funktioiden kanssa

Kentti [15.12.2006 22:01:36]

#

Kun yritän tällaista koodia:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string>

int main() {

    short int numeroita = 0, kirjaimia = 0;
    char *merkki;

    puts("Sy\x94t\x84 ohjelmalle numeroita ja kirjaimia niin kauan kuin jaksat.\nLopeta ohjelma sy\x94tt\x84m\x84ll\x84 merkki #.");
    puts("\nLopuksi ohjelma laskee, montako kirjainta ja montako numeroa sy\x94tit.\n\n");
    puts("Merkki: ");

    while(true) {

                scanf("%c", merkki);

                if (islower(merkki)) kirjaimia++;
                if (isupper(merkki)) numeroita++;
                if (strcmp(merkki2, "#")) break;
    }

    printf("Kirjaimia: %d\nNumeroita: %d", kirjaimia, numeroita);

    system("PAUSE > nul");

    return 0;
}

heittää herjan "Invalid conversion from 'char*' to 'int'" tuosta

...
                if (islower(merkki)) kirjaimia++;
                if (isupper(merkki)) numeroita++;
...

kohdasta. Kääntäjä on (uusin? viime kesänä ladattu) Dev-Cpp.
Mielestäni tuo on oiken, en ainakaan itse löydä siitä virhettä.

Muuten.. Sattuuko kukaan tietämään jotain toista (parempaa?) C++ kääntäjää (ilmaista!!)

Antti Laaksonen [15.12.2006 22:47:25]

#

Yksi merkki on pelkkä char-muuttuja, ja se kirjoitetaan heittomerkkien sisään, esim. 'A' tai '1'. Kahta merkkiä verrataan suoraan samalla tavalla kuin kahta lukua.

Merkkijono on joukko char-muuttujia, ja merkkijono kirjoitetaan lainausmerkkien sisään, esim. "ABC". Kahta merkkijonoa verrataan funktiolla strcmp.

Merkkijonon lopussa on aina nollamerkki. Esim. "ABC" koostuu neljästä merkistä: 'A', 'B', 'C' ja 0. Merkin voi esittää yhtä hyvin lukuna. Esim. 'A' on ASCII-järjestelmässä 65.

Ohjelmassasi on pari virhettä:
- merkki on määritelty osoittimeksi (* pois siis)
- scanf-funktiossa muuttujien edessä pitää olla &
- isupper-funktio ilmoittaa muka, onko merkki numero
- merkkejä verrataan suoraan, ei funktiolla strcmp
- merkki2 kuuluisi varmaan olla merkki

Merkki & tarkoittaa muuttujan osoitetta muistissa, ja funktiolle scanf pitää välittää juuri tämä osoite, jotta funktio tietää, mihin kohtaan muistia luettu arvo pitää tallentaa.

Dev-C++:n mukana tuleva kääntäjä on ihan hyvä, siinä ei tietääkseni ole mitään suurempaa vikaa.

Kentti [16.12.2006 10:20:14]

#

Antti Laaksonen kirjoitti:

- isupper-funktio ilmoittaa muka, onko merkki numero

Tuo, kuten pari muutakin kohtaa (osoitin, jne) oli jäänyt vahingossa, kun kokeilin, toimiiko muilla tavoilla, esim tuolla isupper() funktiolla. Samoin tuo merkki2 :)

Hieman oli kiire tuota viestiä lähettäessä, tarkastus näköjään unohtui :)

Mutta kiitos noista neuvoista, täytyy kokeilla uudestaan.

Edit: Nyt toimii kuin unelma :)
Eikä tarvi merkkejä edes erikseen syöttää.. :)

Oli ilmeisesti siitä kiinni, kun pistin sille char merkki:lle pituuden ja vertasin sitä merkkijonoon tarkistuksessa, onko merkki #.

feenix [18.12.2006 12:36:35]

#

Antti Laaksonen kirjoitti:

- scanf-funktiossa muuttujien edessä pitää olla &

Merkki & tarkoittaa muuttujan osoitetta muistissa, ja funktiolle scanf pitää välittää juuri tämä osoite, jotta funktio tietää, mihin kohtaan muistia luettu arvo pitää tallentaa.

<puolinipo>Ei nyt ihan noin. Joskus se muuttuja on jo osoitin sopivaan paikkaan jolloin & ei kuulu tuohon. Kuten tässä tapauksessa merkki voisi olla oikeasti osoitin haluttuun kohtaan koska on jo osoitin eikä char-tyyppinen muuttuja.</puolinipo>

pieslice [19.12.2006 03:05:04]

#

Kentti kirjoitti:

Muuten.. Sattuuko kukaan tietämään jotain toista (parempaa?) C++ kääntäjää (ilmaista!!)

Microsoftin Platform SDK ja Visual C++ express.

Vastaus

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

Tietoa sivustosta