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

Samankaltaiset tiedostot
Merkkijonot (strings) luku 9)

C-ohjelmointi, kevät Merkkijonot Komentoriviparametrit. Luento

Merkkijonot Komentoriviparametrit

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

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

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

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

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

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

Moduli 5: Kehittyneitä piirteitä

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

C-ohjelmointi, syksy 2006

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

Rakenteiset tietotyypit Moniulotteiset taulukot

Java-kielen perusteet

6.3. AVR_rauta. EEPROM-muisti pva

7. Näytölle tulostaminen 7.1

Lyhyt kertaus osoittimista

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

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

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

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

Harjoitustyö: virtuaalikone

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

Harjoitus 4 (viikko 47)

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

Ohjelmoinnin perusteet Y Python

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

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

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

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

Harjoitus 5 (viikko 48)

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

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

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ä

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

Loppukurssin järjestelyt C:n edistyneet piirteet

ITKP102 Ohjelmointi 1 (6 op)

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

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

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ä.

Metodien tekeminen Javalla

Ohjelmoinnin perusteet Y Python

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

Java-kielen perusteet

Taulukot. Jukka Harju, Jukka Juslin

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

Harjoitus 6 (viikko 42)

Ohjelmoinnin perusteet Y Python

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

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.

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

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

Ohjelmoinnin perusteet Y Python

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

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

Loppukurssin järjestelyt

Tietueet. Tietueiden määrittely

Listarakenne (ArrayList-luokka)

Ohjausrakenteet. Valinta:

Ohjelmointiharjoituksia Arduino-ympäristössä

Hieman linkkejä: lyhyt ohje komentoriviohjelmointiin.

Ohjelmoinnin peruskurssi Y1

Muuttujien roolit Kiintoarvo cin >> r;

ITKP102 Ohjelmointi 1 (6 op)

13 Operaattoreiden ylimäärittelyjä

ITKP102 Ohjelmointi 1 (6 op)

Binäärioperaatiot Tiedostot ja I/O

12. Javan toistorakenteet 12.1

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

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

Harjoitus 3 (viikko 39)

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

Sosiaalihuollon kertomusmerkintä

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

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)

Transkriptio:

, kevät 2006 Merkkijonot Komentoriviarametrit Luento 7 14.3.2006 Kevät 2006 Liia Marttinen 1 Merkkijonot (tring) (Müldnerin kirjan luku 9) 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 Kevät 2006 Liia Marttinen 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 Kevät 2006 Liia Marttinen 3 Merkeitä c on merkki ja c on merkkijono \0564, \xa6 datatyyi int igned char, unigned char L a long int eim. jaanin tai kiinan merkkeihin Syöttö ja tulotu getchar, utchar canf( format, &var), rintf( format, ex) fget, fut, fcanf, frintf Ecae-merkit (amat kuin Javaa) '\n' = rivinvaihtomerkki '\t' = tabulaattori '\v' = ytyuora tabulointi '\b' = eruutumerkki '\r' = rivinalkuunalautumerkki '\f' = ivunvaihtomerkki '\a' = hälytymerkki, yleenä äänimerkki '\\' = kenoviiva '\'' = heittomerkki '\"' = lainaumerkki '\0' = merkkijonon loetumerkki if((c=getchar()) == EOF) if(canf( %d%d, i,j)!=2) if((c=fgetc(tkahva)) == EOF).. while((c= getchar())!= \n ) while ((c=getchar())!=eof) while(getchar()!= \n ) ; Kevät 2006 Liia Marttinen 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 Kevät 2006 Liia Marttinen 5 Kevät 2006 Liia Marttinen 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? Kevät 2006 Liia Marttinen 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. Kevät 2006 Liia Marttinen 8 Merkkijonon muitinvarau ja i:nnen merkin ooittaminen Merkkijonon muitinvarau aina calloc-funktiolla, koka calloc nullaa 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 Kevät 2006 Liia Marttinen 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. Kevät 2006 Liia Marttinen 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 Kevät 2006 Liia Marttinen 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! */ Kevät 2006 Liia Marttinen 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 Kevät 2006 Liia Marttinen 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 Kevät 2006 Liia Marttinen 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 = & Kevät 2006 Liia Marttinen 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ä; Kevät 2006 Liia Marttinen 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,); Mitä luetaan, jo yöte on Java language? Entä, jo yöte on language Java? Entä canf ( %SIZE,);? Ei käy, illä lainaumerkkien iällä ei käitellä makroja! Kevät 2006 Liia Marttinen 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. Kevät 2006 Liia Marttinen 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 Kevät 2006 Liia Marttinen 19 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++; Kevät 2006 Liia Marttinen 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)... 5678.993456 Luvut 34 46.998\0 int rintf (, format, argument) merkkijonon kokoamieen oita rintf(, Syötetty luku oli %d, j); rintf(, "% %d %f", "tet", 1, 1.5); tet 1 1.5\0 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. Vaikka fget onnitueaan aina kirjoittaa muitilohkoon viimeieki \0- merkin, niin merkkijonon kelvolliuu kannattaa varmitaa: buf[trlen(buf)] = \0 ; Tehokkaamiakin taoja näihin toimintoihin on! :n ja :n oltava alutettuja merkkijonoja, joille on varattu riittäväti tilaa muitita calloc-funktiolla. Kevät 2006 Liia Marttinen 21 int fut (cont char *, FILE *out); Kirjoittaa merkkijonon (ilman \0-merkkiä) tiedotoon out. Kevät 2006 Liia Marttinen 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. int ut(cont char *buf); Kirjoittaa merkkijonon ja äättää en aina rivinvaihdolla. Rivi kerrallaan lukemien yleinen ongelma: aina oletettava jokin makimiituu jolle varataan tilaa! Kevät 2006 Liia Marttinen 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. Kevät 2006 Liia Marttinen 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 *trchr(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); 1. joukkoon kuuluva merkki ize_t trcn(cont char *tr, cont char *et); 1. joukkoon kuulumaton merkki char *trbrk(cont char *tr, cont char *et); 1. joukkoon kuuluva merkki merkkijoukon merkkien eiintyminen merkkijonoa, alauttaa eiintymiaikan (ohitettujen merkkien lukumääränä tai ooittimena) Kevät 2006 Liia Marttinen 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. 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 Kevät 2006 Liia Marttinen 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 */ 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; Kevät 2006 Liia Marttinen 27 Kevät 2006 Liia Marttinen 28 Komentoriviarametrit Ooittaminen komentoriviargumentteihin eti Virtanen Ville rektiedoto int main (int argc, char **argv); int main (int argc, char *argv[]); ohjelmannimi arametri1 arametri 2 argc merkkijonojen lukumäärä argv ooitin ooitinlohkoon argc: 4 argv: argv[0] argv[1] argv[2] argv[3] eti\0 Virtanen\0 Ville\0 rektiedoto\0 echo Hello, world argc = 3 argv argv[0] argv[1] argv[2] echo\0 Hello,\0 world\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 Kevät 2006 Liia Marttinen 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; Kevät 2006 Liia Marttinen 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 Kevät 2006 Liia Marttinen 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; Kevät 2006 Liia Marttinen 33 Mitä oittiin? Merkkijonojen alutaminen ja käittely Merkkijonojen yöttö ja tulotu Standardikirjaton funktioita merkkijonojen käittelyyn Komentoriviarametrien käyttö Kevät 2006 Liia Marttinen 34 Eni kerralla Taulukoiden käittelyä Ykiulotteiet taulukot Määrittely, koiointi, vertailu Taulukko arametrina Alutu ja talletu Moniulotteiet taulukot Dynaamiet taulukot Kevät 2006 Liia Marttinen 35 6