Mitä tarkoittaa merkkitaulukko?

sdfd

katso otsikkoa

3

1266

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Innokas koodaaja

      Taulukko, jonka soluihin on tallennettu kirjaimia, eli tähän malliin:

      char etunimi[20 1] = {'M', 'a', 'i', 'j', 'a', '-', 'K', 'a', 'a', 'r', 'i', 'n', 'a', '\0'};

      Ohjeita:
      HUOM! Esitellyt funktiot ja kirjastot toimivat Visual Studio 2008-ohjelmassa. Muista kääntäjistä ei varmuutta.

      /**************************************
      * Merkkijonot ja niiden käsittely
      * - taulukollinen kirjaimia
      * - päättyy aina '\0' eli
      * merkkijonon päättymismerkki
      * - tilanvaraus: muista varata 1
      * eli poäättymismerkille myös
      * char nimi[5 1]
      * - merkkijonoja käsitellään
      * merkkijonojen käsittely-
      * funktioilla
      *
      * strcpy(); : kopioi merkkitaulukon sisältämän merkkijonon toiseen merkkitaulukkoon
      * strlen(); : laskee merkkijonon pituuden, ei huomioi päättömerkkiä.
      * strcmp(); : vertaa kahta merkkijonoa aakkostuksellisesti keskenään.
      * paluuarvo aakkostus
      * 0 jono1 == jono2
      * > 0 jono1 > jono2
      * < 0 jono1 < jono2
      *
      * strcat(); : yhdistetään kaksi merkkijonoa
      *
      **************************************/

      Esimerkkikoodi Visual Studiossa ajettavaksi:

      #include // printf();
      #include // getch();
      #include
      #include // setlocale();
      #include

      int main(void)
      {
      char etunimi[20 1] = {'M', 'a', 'i', 'j', 'a', '-', 'K', 'a', 'a', 'r', 'i', 'n', 'a', '\0'};
      printf("%s\n", etunimi);

      char sukunimi[30 1];

      /* sukunimi = "Lipponen" EI NÄIN!! */

      strcpy(sukunimi, "Lipponen");
      printf("%s\n", sukunimi);

      int pituus;

      pituus= strlen(sukunimi);
      printf("Merkkijonon %s on %d", sukunimi, pituus);

      char eka[10 1];
      char toka[20 1];
      int vertailuarvo;

      printf("\n\nAnna eka nimi: ");
      scanf("%s", eka); // HUOM! ei &-merkkiä!!

      printf("Anna toka nimi: ");
      scanf("%s", toka);

      vertailuarvo = strcmp(eka, toka);

      printf("\n");

      if(vertailuarvo>0)
      printf("%s on ennen %s aakkosissa.\n",toka, eka);

      else if(vertailuarvo

      • mjono

        Menee vähän pieleen. Ensinnäkin merkkijono EI OLE merkkitaulukko!

        char arr1[3] = "abc";

        Nyt arr1 on 'merkki'- (tarkemmin ASCII-merkki) eli char-taulukko, mutta se EI OLE C:n tarkoittama merkkijono!

        char str2[] = "abc";

        str2 taasen on merkkijono (string) C:ssä, koska se loppuu '\0'-merkkiin (eli numeroon 0). Kääntäjä laskee automaattisesti sen koon (kolme) ja lisää '\0'-merkin, jolloin koko on neljä merkkiä.

        C:n merkkijono on siis merkkitaulukko jonka LOPETUSMERKKI (ei välttämättä viimeinen merkki) on '\0' eli numerona 0.

        '\0' takia voidaan käyttää while-silmukkaa:
        void str_shift(char *str, char shift)
        {
           int i = 0;

           while ( str[i] != 0) {
              str[i] = str[i] shift;
              i ;
           }
        }
        str_shift(str2, 3);
        (huomaa charia voi käsitellä kuin integeriä)



        Voidaan myös laittaa näin:

        char str3[21] = "abc";

        Jolloin loppuosa täytetään '\0'-merkeillä.

        Sinänsä oikeassa muodossa

        char etunimi[20 1] = {'M', 'a', 'i', 'j', 'a', '-', 'K', 'a', 'a', 'r', 'i', 'n', 'a', '\0'};

        ei ole paljon järkeä kun täysin sama on:

        char etunimi[20 1] = "Maija-Kaarina";

        HUOM!

        char *vakio = "abcde";

        EI OLE sama kuin

        char ei_vakio[] = "abcde";

        Edellistä ei voi muuttaa.
        http://c-faq.com/decl/strlitinit.html

        (Sitten on vielä dynaaminen varaus:
        char *str = (char *)malloc(40);)

        C:n merkkijono on niin alkeellinen ja sekava että sitä ei voi suositella aloittelijoille (eikä paljon muillekaan), joten käyttäkää C :n string-luokkaa (tai jotain muuta kieltä).


      • fdaa
        mjono kirjoitti:

        Menee vähän pieleen. Ensinnäkin merkkijono EI OLE merkkitaulukko!

        char arr1[3] = "abc";

        Nyt arr1 on 'merkki'- (tarkemmin ASCII-merkki) eli char-taulukko, mutta se EI OLE C:n tarkoittama merkkijono!

        char str2[] = "abc";

        str2 taasen on merkkijono (string) C:ssä, koska se loppuu '\0'-merkkiin (eli numeroon 0). Kääntäjä laskee automaattisesti sen koon (kolme) ja lisää '\0'-merkin, jolloin koko on neljä merkkiä.

        C:n merkkijono on siis merkkitaulukko jonka LOPETUSMERKKI (ei välttämättä viimeinen merkki) on '\0' eli numerona 0.

        '\0' takia voidaan käyttää while-silmukkaa:
        void str_shift(char *str, char shift)
        {
           int i = 0;

           while ( str[i] != 0) {
              str[i] = str[i] shift;
              i ;
           }
        }
        str_shift(str2, 3);
        (huomaa charia voi käsitellä kuin integeriä)



        Voidaan myös laittaa näin:

        char str3[21] = "abc";

        Jolloin loppuosa täytetään '\0'-merkeillä.

        Sinänsä oikeassa muodossa

        char etunimi[20 1] = {'M', 'a', 'i', 'j', 'a', '-', 'K', 'a', 'a', 'r', 'i', 'n', 'a', '\0'};

        ei ole paljon järkeä kun täysin sama on:

        char etunimi[20 1] = "Maija-Kaarina";

        HUOM!

        char *vakio = "abcde";

        EI OLE sama kuin

        char ei_vakio[] = "abcde";

        Edellistä ei voi muuttaa.
        http://c-faq.com/decl/strlitinit.html

        (Sitten on vielä dynaaminen varaus:
        char *str = (char *)malloc(40);)

        C:n merkkijono on niin alkeellinen ja sekava että sitä ei voi suositella aloittelijoille (eikä paljon muillekaan), joten käyttäkää C :n string-luokkaa (tai jotain muuta kieltä).

        "char *vakio = "abcde";

        EI OLE sama kuin

        char ei_vakio[] = "abcde";"

        Molemmat samaa tyyppiä; Toisen muuttaminen johtaa ei-määriteltyyn käyttäytymiseen.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Selvästi näyttää siltä, että SDP:n kannattajat hyväksyy kiusaamisen

      ja seksuaalisen ahdistelun, kun puolueen kannatus pysyy korkealla. Mitä tämä kertoo demari-äänestäjien moraalista?
      Maailman menoa
      137
      3546
    2. Päivi Räsäsen seksipaljastus loksauttaa Katja Ståhlin leuat! Elämäni biisi kohujakso tv:ssä!

      Elämäni biisi -suosikkisarjan uusinnat ovat startanneet ja nyt vuorossa on sarjan 2. jakso v. 2019. Sinisille sohville
      Suomalaiset julkkikset
      55
      3121
    3. Muistan vuosikymmenten takaa

      Toivottavasti voit hyvin ja jaksat työssäsi. Olet upea ja erinomainen ihminen, toivon kaikkea hyvää.
      Ikävä
      12
      2584
    4. Montako mitalia Suomi saa talviolympialaisista?

      Nyt heittäkää veikkaus Suomen mitalisaldosta ja mistä lajeista metallilätkät tulevat. Oma veikkaukseni on 6 mitalia. -
      Maailman menoa
      115
      2141
    5. Voiko kaivattu olla liian vanha?

      Tai muuten huonokuntoinen...
      Ikävä
      171
      1786
    6. Kokemuksia Rehux Oy yrityksestä työpaikkana?

      Jonkin aikaa seurannut kyseistä firmaa sivusta, näyttäisi, että tälläkin hetkellä olisi peräti 3 eri roolia tai paikkaa
      Työpaikat
      31
      1346
    7. Missä näit viimeksi kaivattusi?

      Menikö kohtaaminen hyvin vai ujousko esti lähestymästä?
      Ikävä
      54
      1172
    8. IS: Riitta Väisänen kärsii ikävästä vaivasta - Vaipparalli ja 40 antibioottikuuria takana...

      71-vuotias Riitta Väisänen on kertonut tuoreista terveysongelmistaan. Väisänen on kertonut julkisuudessa jo aiemmin vaih
      Terveys
      16
      953
    9. Jos mies oikeasti haluaa sinut

      Hän ei ota riskiä että menettäisi sinut. Ei pienintäkään. Mies ei jätä vastaamatta viesteihin eikä pidä sinua epätietois
      Ikävä
      110
      923
    10. Polvinen hylkäsi Persut

      Polvinen teki ratkaisun, lähti Persujen paraati paikalta. Moni on jättänyt puolueen tavallisten kansalaisten joukosta.
      Kajaani
      158
      922
    Aihe