Mitä tarkoittaa merkkitaulukko?

sdfd

katso otsikkoa

3

1255

    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. En minä kyllä enää odota sinua

      Olet siellä sen harmaan kanssa. Niin, annoit minun nähdä lämpimät tunteesi siitä huolimatta. Se merkitsi kyllä paljon. O
      Ikävä
      35
      1846
    2. Jos joku luulee että kaikki käy

      Sanon vain tämän. Minun kanssani ei neuvotella. Minun kanssani eletään tasavertaisesti. Jos se on liikaa, niin ovi rinn
      Ikävä
      60
      1465
    3. Taas pedofiliatuomio Haapaveelle

      Vastenmielisiä ja vakavia rikostapauksia pikkupaikkakunnan alueellekin näyttää riittävän. Tämän alan rikoksien tuomiot
      Haapavesi
      36
      1415
    4. Joka kolmas työtön on työkyvytön

      Viime vuonna työnhakuvelvoitteen ulkopuolella oli noin kolmannes työttömistä työnhakijoista. Huhheijaa, mihin suomalais
      Maailman menoa
      165
      1328
    5. Sakin hivutus - ilmiö

      Miten tuollainen tuollainen ilmiö kuin ”sakin hivutus” syntyy? Mitä syitä ilmiön syntymiseen tarvitaan? Onko sakissa jok
      80 plus
      68
      1219
    6. Ei ole rohkeutta tulla jututtamaan

      Voidaan me nähdä ja tervehtiä, sitäkin harvoin, mutta iso kynnys on edes mennä lähelle ja kysyä kuulumisia. Ymmärrät var
      Tunteet
      8
      1201
    7. Julkinen saunatilanne Haapavedellä, tämä on täyttä paskaa!

      Eilen Haapaveden uimahallin saunassa koettu tilanne oli täysin käsittämätöntä ja helvetin järkyttävää. Ladyboy harjoitti
      Haapavesi
      19
      856
    8. Me ei voida olla yhdessä

      Järki päähän ja realiteetit huomioon ottaen.
      Ikävä
      58
      818
    9. Mitä tapahtuu?

      Mitä säpäkän risteyksessä on tapahtunut kun poliiseja, ambulansseja ja kopteri paikalla?
      Outokumpu
      12
      794
    10. Kuhmon K-kaupan vanhenevat hapannaamat kassoilla

      Pitemmän aikaa olen ihmetellyt kaverin kanssa miksi Kuhmon K-kaupassa on aina tympeimmät kassattöntekijät? Kesällä tulee
      Kuhmo
      14
      745
    Aihe