Olen opetellut c:tä tässä vähän aikaa ja osaan tehdä dynaamisia taulukoita käyttäen inttiä ja doublea.
Nyt yritän tehdä ohjelman tynkää, jossa voisi kysyä käyttäjältä yksittäisiä merkkejä taulukkoon. Luettavien merkkien määrän haluaisin kysyä siis myös käyttäjältä. Eli ohjelma ensin kysyy minkä kokoinen taulukkotehdään, sitten kysellään yksittäisiä merkkejä taulukko täyteen.
No tämän kaltaisen ohjelman osaan tehdä käyttäen lukuja, mutta en onnistu merkeillä millään?
Alla koodini jolla tehdään haluttu temppu doubleilla, eli mitä ihmettä pitäis tehdä että onnistuis chareilla?
#include <stdio.h> #include <stdlib.h> int main(void) { double *taulukko; int koko; int i; printf("Mikas kokoinen taulukko tehdaan ?\n"); scanf("%d",&koko); taulukko =(double *) malloc( koko*sizeof(double)); for(i=0;i<koko;i++) { printf("anna reaaliluku:\n"); scanf("%lf",&taulukko[i]); } printf("Taulukossa on luvut: \n"); for (i = 0; i < koko; i++) { printf("%.3lf ", taulukko[i]); printf("\n"); } return(0); }
No eikös toi menis sillä että luot vaan merkkitaulukon(char) ja sit kysyt niitä merkkejä sinne samalla tavalla kun tossa ja sit liität jokaisen merkin siihen taulukkoon strcat-funktiolla.
Malloc toimii samaan tapaan merkkien kanssa kuin numeroillakin. Vai haluatko taulukon merkkijonoja? Tällöin tarvitset esim. char jono[2][10].
Copy/Paste studion helpistä, että miten saat merkit luettua:
int i, result; float fp; char c, s[81]; wchar_t wc, ws[81]; printf( "\n\nEnter an int, a float, two chars and two strings\n"); result = scanf("%d %f %c %C %s %S", &i, &fp, &c, &wc, s, ws);
Ei vaan yritän luodan taulukon johon voi tallettaa yksittäisiä
merkkejä ja käyttäjä voi itse määrätä taulukon koon.
Alla oleva koodi ei toimi oikein. Ohjelma kysyy kyllä taulukon koon mutta antaa silti lukea forin sisällä vain yhden merkin ja nakkaa ulos silmukasta. Eli missä vika?
#include <stdio.h> #include <stdlib.h> int main(void) { char *taulukko; int koko; int i; printf("Mikas kokoinen taulukko tehdaan ?\n"); scanf("%d",&koko); taulukko =(char *) malloc( koko * sizeof(char)); for(i=0;i<koko;i++) { printf("anna merkki:\n"); scanf("%c",&taulukko[i]); } printf("Taulukossa on merkit: \n"); for (i = 0; i < koko; i++) { printf("%c ", taulukko[i]); printf("\n"); } return(0); }
Kokeile laittaa getchillä.
a = getch(); taulukko[i] = a;
getch() ei ole standardia vaan joku conio-juttu. Ainakaan minulta ei tuota löydy mistään. Standardisti merkin saa luettua funktiolla fgetc(stdio) (luetaan merkki stdio-streamista, siis yleensä ruudulta), joka palauttaa yhden merkin. Tässä pitää kuitenkin muistaa huomioida, että myös Enter palautetaan. Kokeilemalla selviää, mitä ylimääräistä yhden merkin jälkeen tulee. Kannattaa varmaan käyttää ylimääräistä while-silmukkaa, jossa tarkistaa, että merkki on kelpaava:
for (i=0;i<koko;i++) { // Luetaan yksi merkki. taulukko[i] = fgetc(stdio); // Luetaan lisää, kunnes tulee muu kuin Enter. while (taulukko[i] == '\r') taulukko[i] = fgetc(stdio); }
No tällä koodillani kun yritän käyttää taulukko[i] = fgetc(stdio); tulee virheilmoitus undeclared indentifier eli pitäiskö tuo määritellä.
Tässä koodi millä nyt yritetään...
#include <stdio.h> #include <stdlib.h> int main(void) { char *taulukko; int koko; int i; printf("Mikas kokoinen taulukko tehdaan ?\n"); scanf("%d",&koko); //mallocilla saadaan koko halutun laiseksi! taulukko =(char *) malloc( koko * sizeof(char)); for(i=0;i<koko;i++) { printf("anna merkki:\n"); taulukko[i] = fgetc(stdio); while (taulukko[i] == '\r') taulukko[i] = fgetc(stdio); } printf("Taulukossa on luvut: \n"); for (i = 0; i < koko; i++) { printf("%c ", taulukko[i]); printf("\n"); } return(0); }
Eli joku tuossa vielä hieman mättää..?
Niin vielä onko tuo conio.h puhdasta c:tä vai c++??
-tarkoitus on tehdä näin harjoituksen vuoksi kaikki puhtaalla karvalakki c:llä :)
conio() ei ole "puhdas" sikäli, että se on alustariippuvainen eikä kuulu standardiin. On se varmaankin C:tä kuitenkin.
Tuossa antamassani funktiossa pitäisi tietenkin olla syötteenä stdin
eikä stdio
, anteeksi kamalasti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.