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!!)
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.
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 #.
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>
Kentti kirjoitti:
Muuten.. Sattuuko kukaan tietämään jotain toista (parempaa?) C++ kääntäjää (ilmaista!!)
Microsoftin Platform SDK ja Visual C++ express.
Aihe on jo aika vanha, joten et voi enää vastata siihen.