Merkkijonot (strings) luku 9)

Samankaltaiset tiedostot
Merkkijonot (strings) (Müldnerin kirjan luku 9) Luennon sisältö. Merkeistä. Merkkien luokittelufunktiot. Merkkijonot Komentoriviparametrit

C-ohjelmointi, syksy Merkkijonot Komentoriviparametrit. Luento C-ohjelmointi Syksy

Merkkijonot Komentoriviparametrit

C-ohjelmointi, kevät Merkkijonot Komentoriviparametrit. Luento

Merkkijonot Komentoriviparametrit

S if b then S else S S s. (b) Muodosta (a)-kohdan kieliopin kanssa ekvivalentti, so. saman kielen tuottava yksiselitteinen.

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Java-kielen perusteet

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Ohjelmoinnin perusteet Y Python

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

C-ohjelmointi, syksy 2006

C-ohjelmointi, syksy Yksiulotteiset taulukot Moniulotteiset taulukot Dynaamiset taulukot. Binääritiedostot. Luento

Moduli 5: Kehittyneitä piirteitä

Java-kielen perusteet

Rakenteiset tietotyypit Moniulotteiset taulukot

Luennon sisältö. Taulukot (arrays) (Müldnerin kirjan luku 10) Yksiulotteiset taulukot. Mikä taulukko on? Taulukko-osoitin. tavallinen osoitin

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

6.3. AVR_rauta. EEPROM-muisti pva

7. Näytölle tulostaminen 7.1

Lyhyt kertaus osoittimista

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Ohjeet. AS C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti , Raimo Nikkila

Harjoitustyö: virtuaalikone

Harjoitus 4 (viikko 47)

Sisältö. 2. Taulukot. Yleistä. Yleistä

S if b then S else S S s. (b) Muodosta (a)-kohdan kieliopin kanssa ekvivalentti, so. saman kielen tuottava yksiselitteinen.

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmoinnin perusteet Y Python

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Java-kielen perusteita

C-kurssi syksy ltö. Luennon sisält. Luento 2: tyypit, rakenteet, makrot Tyypit. signed, unsigned short,, long Vakiot const Rakenteet

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Metodien tekeminen Javalla

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Luennon sisält. ltö. C-kurssi syksy ääreet: int ja char. Yksinkertaiset tyypit. Kokonaisluvut. Merkit

Harjoitus 5 (viikko 48)

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

C-kurssi kevät Luennon sisältö

Luennon sisältö. C-kurssi kevät Tasokokeen kohta 1: Taulukon järjestäminen. Tasokokeen kohta 2. Tasokokeen kohta 2. Tasokokeen kohta 3

ITKP102 Ohjelmointi 1 (6 op)

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Java-kielen perusteet

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Ohjelmoinnin perusteet Y Python

Harjoitus 6 (viikko 42)

Tietueet. Tietueiden määrittely

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä.

Ohjelmoinnin perusteet Y Python

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

Loppukurssin järjestelyt C:n edistyneet piirteet

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmointiharjoituksia Arduino-ympäristössä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Taulukoiden käsittely Javalla

Ohjelmoinnin perusteet Y Python

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Ohjelmoinnin perusteet Y Python

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

ITKP102 Ohjelmointi 1 (6 op)

Merkkijonot ja C++ Antti-Juhani Kaijanaho. 5. maaliskuuta Vanhojen C++-kääntäjien käyttäjät, huomio! 2 Merkkijonojen perusteet

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

14. Hyvä ohjelmointitapa 14.1

Listarakenne (ArrayList-luokka)

Ohjausrakenteet. Valinta:

Hieman linkkejä: lyhyt ohje komentoriviohjelmointiin.

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

KUINKA PALJON VAROISTA OSAKKEISIIN? Mika Vaihekoski, professori. Lappeenrannan teknillinen yliopisto

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Muuttujien roolit Kiintoarvo cin >> r;

13 Operaattoreiden ylimäärittelyjä

ITKP102 Ohjelmointi 1 (6 op)

12. Javan toistorakenteet 12.1

ITKP102 Ohjelmointi 1 (6 op)

Binäärioperaatiot Tiedostot ja I/O

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

C-kieli mahdollistaa hyvin tiiviin ja samalla sekavan tavan esittää asioita, kuitenkin hyvän ohjelman tulisi olla mahdollisimman helppolukuinen ja

Ohjelmoinnin perusteet Y Python

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Tiedosto on yhteenkuuluvien tietojen joukko, joka tavallisimmin sijaitsee kiintolevyllä, muistitikulla tai jollakin muulla fyysisellä tietovälineellä.

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Sosiaalihuollon kertomusmerkintä

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Merkkijonon tutkiminen matches-metodilla

Transkriptio:

, yky 2007 Merkkijonot (tring) luku 9) (Müldnerin kirjan Merkkijonot Komentoriviarametrit Luento 7 28.9.2007 Syky 2007 1 C:ä merkkijono ei ole ennaltamääritelty datatyyi (kuten Javaa) Merkkijono on ooitin merkkeihin Ooitin mjono: Joukko merkkejä muitia\0 Merkkijonojen käittelyä varten tandardikirjato tring.h Syky 2007 2 Luennon iältö Kirjatofunktiot merkkien käittelyyn Merkkijonon määrittely ja alutaminen ja käyttö Merkkijonojen lukeminen ja kirjoittaminen formatoitu I/O merkkijonoille canf ja rintf Riveittäin lukeminen ja tulotaminen fget ja fut; get ja ut Kirjatofunktiot merkkijonojen käittelyyn Komentoriviarametrit Syky 2007 3 Ecae-merkit (amat kuin Javaa) '\n' = rivinvaihtomerkki '\t' = tabulaattori '\v' = ytyuora tabulointi Merkeitä '\b' = eruutumerkki '\r' = rivinalkuunalautumerkki '\f' = ivunvaihtomerkki '\a' = hälytymerkki, yleenä äänimerkki c on merkki ja c on '\\' = kenoviiva '\'' = heittomerkki merkkijono '\"' = lainaumerkki datatyyi int '\0' = merkkijonon loetumerkki igned char, unigned char L a long int eim. jaanin tai kiinan merkkeihin if((c=getchar()) == EOF) Syöttö ja tulotu if(canf( %d%d, i,j)!=2) getchar, utchar if((c=fgetc(tkahva)) == EOF).. canf( format, &var), while((c= getchar())!= \n ) rintf( format, ex) while ((c=getchar())!=eof) fget, fut, fcanf, frintf while(getchar()!= \n ) ; Syky 2007 4 #include<ctye.h> Kirjatofunktioita merkkien käittelyyn Merkkien luokittelufunktiot Standardikirjaton ctye.h funktioita Merkkien luokitteluun ilower(int c) idigit(int c) alauttaa nollan, jo merkki ei ole kyyttyä tyyiä, muuten nollata eroavan arvon Merkkimuutokiin tolower(int c) touer(int c) jo muuto onnituu, alauttaa muutetun arvon, muuten alauttaa EOF:n Alfanumeeriet int ialnum(int c) int ialha(int c) int ilower(int c) int iuer(int c) int idigit(int c) int ixdigit(int c) int iodigit(int c) Muut merkit int irint(int c) int igrah(int c) int iunct(int c) int iace(int c) i c an alhanumeric i c an alhabetic letter i c a lower cae letter i c an uer cae letter i c a digit i c a hexadecimal digit i c an octal digit if (c>= a && c<= z ) Kirjatofunktioilla iirrettävämää koodia! i c rintable (not a control character) i c rintable (not a ace) i c rintable (not ace or alhanumeric) i c whiteace Syky 2007 5 Syky 2007 6 1

Merkkijonon määrittely ja muitinvaraaminen merkkijonolle Merkkijono määritellään ooittimena, joka ooittaa merkkeihin: char *; Merkkijonolle itää myö varata tilaa muitita. Myö \0-merkille on varattava tilaa Kirjatofunktiot oaavat käitellä merkkijonona vain ellaita merkkien jonoa, joka äättyy \0-merkkiin! Eim. 10 merkin jonolle varattava 11 merkin kokoita muitialuetta: muitinvarau -fraai #define SIZE 10 if(( = malloc((size+1)*izeof(char))) == NULL). Mitä tehdään varauken eäonnituea? Syky 2007 7 Merkkijonon alutaminen ja merkkijonon ituu Vain muitialue, johon ooittaa, mutta ei vielä merkkijono, koka \0 uuttuu! Alutettu, tyhjä merkkijono: [0] = '\0'; \0 Merkkijono, jonka ituu on 0! Merkkijonoon voidaan tallettaa liää merkkejä: H E L L O A L L \0 Nyt merkkijonon ituu on 9. Syky 2007 8 Merkkijonon muitinvarau ja i:nnen merkin ooittaminen Merkkijonon muitinvarau aina calloc-funktiolla, koka calloc nollaa muitialueen => merkkijono on alutettu if(( = calloc(n+1, izeof(char))) == NULL).. viittau merkkijonon i:nteen merkkiin [i] :llä (0<= i < merkkijonon ituu) H E L L O A L L \0 [0] [1] [2] [3] [4] [5] [6] [7] [8] S[3] = L ja [6]= A Syky 2007 9 Merkkijonon refiki (alkuää) ja uffiki (louää) H E L L O A L L \0 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] Merkkijonon louäähän ääee heloti käiki Eimerkiki +6 ooittaa merkkijonoa ALL, jonka ituu on 3 merkkiä +8 ooittaa merkkijonoa L, jonka ituu on 1 merkki +9 ooittaa tyhjää merkkijonoa, jonka ituu on 0 +10 ei ooita mihinkään merkkijonoon! Alkuäähän eim. merkkijonoon HELL on taa vaikeami äätä käiki, koka e ei ääty \0-merkkiin. Syky 2007 10 Merkkijonovakio char *nimi = Tarja Halonen Vakion iältöä Tarja Halonen\0 ei aa muuttaa nimi On voitu tallettaa eim. read only alueelle Ei aa välittää arametrina ellaielle funktiolle, joka muuttaa arametrinaan aamaa merkkijonoa Huomaa ero: T ja T T on merkki T T on merkkijono eli merkki T ja itä euraava null-merkki T\0 Syky 2007 11 Merkkijono arametrina ja aluuarvona Koka merkkijono on iteaiaa ooitin, itä voidaan käyttää amalla tavoin kuin ooittimia yleenä Merkkijonon tulee olla alutettu (muuten ei ole merkkijono!) Merkkijonovakioita ei aa muuttaa # funktio muuttaa # merkkijonon 1. merkin # ioki kirjaimeki void modify(char *) { [0] = touer([0]); char *; /* EI VIELÄ! modify(); */ if(( = calloc(10, izeof(char))) == NULL) errorf(); [0] = 'h'; [1] = 'i'; /* [2] == '\0' */ modify(); h i \0 H i \0 H I \0 modify(+1); char *q = "hello"; /*merkkijonovakio*/ modify(q); /* EI, EI; EEII näin! */ Syky 2007 12 2

Merkkijono arametrina ja aluuarvona (2) (vanha merkkijono ei muutu, nyt muuto tehdään en koioon) Muita vaauttaa muitilohko, char *modify(cont char *) { kun itä ei enää tarvita: char *new; /* uui merkkijono */ char *; /* elaa vanhaa */ free (new); char *n; /* elaa uutta */ if ((new = calloc (length()+1), izeof(char))) == NULL) return NULL; for ( =, n = new; *; ++, n++) *n = *; *n = *; /* koioi vielä \0-merkin /* new[0] = touer(new[0]); return new; tarja H.\0 char * = tarja H. ; char *q = modify(); q = modify(+3); tai char *q =modify( tarja H. ); tarja H.\0 Ja H.\0 Tarja H.\0 Syky 2007 13 q q Erilaiia koiointitaoja while((q[i]= [i])!= \0 ) i++; while((*q=*)!= \0 ) {q++; ++; while ((*q++=*++)!= \0 ); while (*q++ = *++); Tekevät aman aian: koioivat merkit merkkijonota merkkijonoon q. Muita varata muitita tilaa merkkijonolle q ennen koioimita. Älä hukkaa merkkijonojen alkuja! Koioitava merkkijono\0?? q Koioita Syky 2007 14 Muutetun merkkijonon alautu arametrina Eimerkki: funktio tarkitaa, onko annettu merkkijono kelvollinen kokonailuku joko deimaalina tai hekadeimaalina eitettynä. void modify1(cont char *, char **new) { /* return through arameter a coy of modified*/ char *; /* elaa vanhaa */ char *n; /* elaa uutta */ new if ( == NULL) return -1; if ((*new = calloc (length()+1), izeof(char))) == NULL) return NULL; for ( =, n = *new; *; ++, n++) *n = *; *n = *; /* koioi vielä \0-merkin /* (*new)[0] = touer((*new)[0]); char *; modify1("hello", &); ooitin : hello\0 ooitin char ooitin, joka ooittaa ooittimeen, joka ooittaa char tyyieen muuttujaan Calloc-funktion varaama muitialue H e l l n new = & Syky 2007 15 int inumber(cont char *) { if ( == NULL [0] == \0 ) /* tyhjä merkkijono */ return 0; # onko hekaluku eli tyyiä 0x2A68? if ([0] == 0 ) { /*nolla enimmäienä*/ if ([1] == \0 ) return 1; /*elkkä nolla kelaa*/ if([1] == x [1] == X ) { /*hekaluku?*/ if ([2] == \0 ) return 0; /* 0x ei riitä*/ for ( +=2; *; ++) if (!ixdigit (*)) return 0; return 1; /* kelvollinen hekaluku */ # onko deimaaliluku for (;*; ++) if (!idigit (*)) return 0; return 1; Fraai merkkijonon läikäyntiin: for ( = ; *; ++) käytä *:tä; Syky 2007 16 Merkkijono ja formatoitu I/O % ekä yötöä että tulotukea Syötöä merkkijonon alua olevat tyhjät ohitetaan ja lukeminen aloitetaan enimmäietä ei-tyhjätä merkitä Luetaan yki ana eli euraavaan tyhjään merkkiin ati => canf lukee vain yhden anan cont int SIZE = 7; char *; if (( = malloc((size + 1) * izeof(char))) == NULL) virhetilanne(); canf( %, ); canf ( %7,); Entä canf ( %SIZE,);? Mitä luetaan, jo yöte on Java language? Entä, jo yöte on language Java? Ei käy, illä tulkitee %S:n formaattiki Syky 2007 17 Merkkijonon lukeminen canf ( %, ) koka on ooitin Ennen lukemita merkkijonolle on oltava muitia varattuna Muitia on oltava tareeki! Varmita rajoittamalla ituu. if (canf( %10, )!=1) error Lukee yhden korkeintaan 10 merkin mittaien anan. Varaa tilaa myö \0- merkille. Syky 2007 18 3

Merkkijonon tulotu rintf( %, tr) tulotaa ooittimen tr ooittaman muitilohkon kaikki merkit \0-merkkiin aakka char * = C ja Java ovat kieliä. rintf ( %\n, ); rintf ( %\n, +5); Tulotu: C ja Java ovat kieliä. Java ovat kieliä. C ja Java ovat kieliä.\0 +5 Eimerkki int lower(char *) { /* return number of l.c. letter */ int i; char *q; for(i = 0, q =, *q, q++) if(ilower(*q)) i++; return i; int main() { cont int M = 10; char *; if(( = calloc(m + 1, izeof(char)) == NULL) return EXIT_FAILURE; if(canf("%10", )!= 1) return EXIT_FAILURE; rintf("%d lower cae letter in %\n", lower(), ); return EXIT_SUCCESS; Ohjelma lukee yhden korkeintaan 10 merkin mittaien anan ja tulotaa iinä olleiden ienten kirjainten lukumäärän. #include <tdio.h> #include <tdlib.h> #include <ctye.h> for(i = 0, q = ; *q; q++) if(ilower(*q)) i++; = ; i=0; while (*++) if (ilower(*)) i++; Syky 2007 19 Syky 2007 20 canf ja rintf merkkijonota lukeminen ja merkkijonoon kirjoittaminen fget ja fut tiedoto merkkijono (myö tdin ja tdout) Rivi kerrallaan lukeminen ja kirjoittaminen int canf (, format, argument) merkkijonot luvuiki if (canf (,"%lf", &d)!=1) if(canf(+6, "%d%f", &i, &d)!= 2)... int rintf (, format, argument) merkkijonon kokoamieen oita rintf(, Syötetty luku oli %d, j); rintf(, "% %d %f", "tet", 1, 1.5); char* fget(char *buf, int n, FILE *in); Lukee yhden rivin, mutta enintään n-1 merkkiä tiedotota in ja tallettaa en muitilohkoon buf. Tallettaa myö rivinloetumerkit. fget onnitueaan aina kirjoittaa muitilohkoon viimeieki \0-merkin. 5678.993456 Luvut 34 46.998\0 Tehokkaamiakin taoja näihin toimintoihin on! tet 1 1.5\0 :n ja :n oltava alutettuja merkkijonoja, joille on varattu riittäväti tilaa muitita calloc-funktiolla. Syky 2007 21 int fut (cont char *, FILE *out); Kirjoittaa merkkijonon (ilman \0-merkkiä) tiedotoon out. Syky 2007 22 get ja ut tdin-yöttö ja tdout-tulotu Merkkijono-oeraatiot: <tring.h> char * get(char *buf); Lukee aina koko rivin (ei ii korkeintaan tiettyä määrää) eikä talleta rivin loetumerkkiä muitilohkoon. ÄLÄ KÄYTÄ! int ut(cont char *buf); Kirjoittaa merkkijonon ja äättää en aina rivinvaihdolla. Rivi kerrallaan lukemien yleinen ongelma: aina oletettava jokin makimiituu jolle varataan tilaa! Syky 2007 23 Runaati merkkijonoja käitteleviä funktioita Merkkijonon ituu ize_t trlen (cont char *tring); Huom! merkkijonojen ituukien vertailu if (trlen(x) >= trlen(y)) if ((int)trlen(x) SIZE >= 0) Merkkijonon koiointi char *trcy(char *det, cont char *rc); char *trncy(char *det, cont char *rc, ize_t n); Merkkijonon liittäminen toieen char *trcat(char *det, cont char *rc); char *trncat(char *det, cont char *rc, ize_t n) Varmita, että koio on alutettu merkkijono koiolle on varattu tareeki muititilaa koioon tulee \0- merkki. Syky 2007 24 4

Liää merkkijono-oeraatioita <tring.h> Palauttaa Merkkijonojen vertailu (merkki merkiltä) <0 jo 1 < 2 int trcm(cont char *1, cont char *2); 0 jo 1 == 2 int trcnm(cont char *1, cont char *2, ize_t n); >0 jo 1 > 2 Merkin tai merkkijonon etiminen char *trchr(cont char *tr, int c); enimmäinen c:n eiintymä char *trrchr(cont char *tr, int c); viimeinen c:n eiintymä char *trtr(cont char *tr, cont char *ubtr); etii merkkijonoa ize_t trn(cont char *tr, cont char *et); et:in kuuluvia alua ize_t trcn(cont char *tr, cont char *et); et:iin kuulumatomia alua char *trbrk(cont char *tr, cont char *et); 1. et:iin kuuluvaan viite merkkijoukon merkkien eiintyminen merkkijonoa, alauttaa eiintymiaikan (ohitettujen merkkien lukumääränä tai ooittimena) Syky 2007 25 Yhä merkkijono-oeraatiota <tring.h> Merkkijonon jako anoiki (token) /home/avirta/kuri/c/2006/teti.c\0 erotumerkein tr char *trtok(char *tr, cont char *e); char *e \ ; enimmäiellä kerralla annettava merkkijono; euraavilla kerroilla voi antaa en tilalla NULL:in trtok(null, e); Tällöin jatkaa euraavan anan etimitä amata merkkijonota. Tee koio ja käytä itä! Muuttaa merkkijonoa: \0 jokaien havaitun anan erään. Palauttaa tr:n oia. Merkkijono numeroiki <tdlib.h> double trtod(cont char *, char **); long trtol(cont char *, char **, int bae); fail: :n alkuun unigned long trtoul(cont char *, char **, int bae); ucce: eka muuttamaton ANSI C verioita, jotka korvaavat vanhat: atof, atoi ja atol merkki Syky 2007 26 Eimerkki: Merkkijonon riiuminen turhita edeä ja erää olevita tyhjämerkeitä tai muita turhita merkeitä Heia vaan \0 Heia vaan\0 /* tri from leading and trailing character from * et. For examle: * char * = tri(",hi, how are you,", ","); */ char *tri(cont char *, cont char *et) { int tart = trn(, et); /* leading character*/ int end; /* trailing character */ char *koy; int length = trlen(); /*merkkijonon ituu*/ if(length!= tart) { /* there are character not in et */ for(end = length; end > 1; end--) /* trailing */ if(trchr(et, [end]) == NULL) /* onko oitettava merkki */ break; length = end - tart + 1; /* left after tri */ Müldnerin kirjan eimerkki 9-13 Eimerkki jatkuu: /*char *tri() continued */ if((koy = calloc(length + 1, izeof(char)))==null) return NULL; memcy(koy, + tart, length); koy[length] = '\0'; /* length!= tart */ ele { /* here, no character in */ if((koy = calloc(length + 1, izeof(char)))==null) return NULL; trcy(koy, ); return koy; Syky 2007 27 Syky 2007 28 Komentoriviarametrit Ooittaminen komentoriviargumentteihin eti Virtanen Ville rektiedoto int main (int argc, char **argv); int main (int argc, char *argv[]); ohjelmannimi arametri1 arametri 2 echo Hello, world argc = 3 argv argc merkkijonojen lukumäärä argv ooitin ooitinlohkoon argv[0] argv[1] argv[2] echo\0 Hello,\0 world\0 argc: 4 argv: argv[0] argv[1] argv[2] eti\0 Virtanen\0 Ville\0 Standardi vaatii myö, että argv[argc] on NULL. argv[3] rektiedoto\0 argv[0] tai *argv ooittaa 1. arametriin eli ohjelman nimeen ( eti ), argv[1] tai *(argv+1) ooittaa 2. arametriin ( Virtanen ) argv[2] tai *(argv+2) ooittaa 3. arametriin ( Ville ) argv[3] tai *(argv+3) ooittaa 4. arametriin ( rektiedoto ) echo Hello, world -merkit toimivat argv argv[0] echo\0 joiakin järjetelmiä! argv[1] Hello, world\0 argc = 2 Syky 2007 29 argv[0][0] tai (*argv)[0] tai **argv ooittaa 1. arametrin 1. merkkiin argv[2][4] tai (*(argv+2))[4] tai *(*(argv+2)+4) ooittaa 3. arametrin 5. merkkiin. 5

Komentoarametrien lukumäärän tarkitu /* Tarkita komentoriviarametrien lukumäärä! */ int main(int argc, char **argv) {. witch(argc) { cae 4: /* kaikki tiedot annettu komentorivillä*/ cae 3: /*OK! käytetään oletuarvoa*/ default: frintf(tderr, Väärä käyttötaa: %.. \n", argv[0]); /*Voii myö kertoa oikean käytötavan!*/ return EXIT_FAILURE; Syky 2007 31 Komentoriviarametrien käyttö: Tiedoton rivien tulotu näytölle #define DEFAULT 10 #define MAX 80 /*tulotaa näytölle tiedoton n enimmäitä riviä */ int dilay(cont char *fname, int n, int Max); int main(int argc, char **argv) { int line = DEFAULT; witch(argc) { cae 3: /* elvitä rivien lukumäärä argumentti */ ohjelman nimi rivien lkm how -n fname - = argumentti on otionaalinen; voi uuttua tiedoton nimi if(argv[1][0]!= '-' canf(argv[1] + 1, "%d", &line)!=1 line <= 0) return EXIT_FAILURE; argv++; /* no break: retrieve filename */ cae 2: if(dilay(argv[1], line, MAX) == 0) return EXIT_FAILURE; break; default: return EXIT_FAILURE; argv argv argv[0] how\0 argv[0] how\0 return EXIT_SUCCESS; argv[1] -n\0 argv[1] teti\0 argv[2] teti\0 Syky 2007 32 Ohjelma lakee ja tulotaa arameteina annettujen lukujen umma #include <tdio.h> #include <tdlib.h> int main(int argc, char **argv) { int i; double luku, umma=0.0; char **; char *; if (argc==1) { rintf ("Parametreja voi olla vaihteleva"); rintf (" määrä ja ne voivat olla"); rintf (" kokonailukuja tai liukulukuja"); rintf ("\nkäyttö: SUMMA arg1 arg2... argn\n"); exit(0); /* loetetaan ohjelman toiminta */ if (( = calloc(80, izeof(char))) == NULL) return 1; = &; for (i=1; i<argc; i++) { luku = trtod(argv[i], ); umma=umma+luku; rintf ("Lukujen umma on %.2lf\n",umma); return 0; Syky 2007 33 Mitä oittiin? Merkkijonojen alutaminen ja käittely Merkkijonojen yöttö ja tulotu Standardikirjaton funktioita merkkijonojen käittelyyn Komentoriviarametrien käyttö Syky 2007 34 Eni kerralla Taulukoiden käittelyä Ykiulotteiet taulukot Määrittely, koiointi, vertailu Taulukko arametrina Alutu ja talletu Moniulotteiet taulukot Dynaamiet taulukot Syky 2007 35 6