Mitä tarkoittaa merkkitaulukko?

sdfd

katso otsikkoa

3

1229

    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. Janne Ahonen E R O A A

      Taas 2 lasta jää vaille ehjää perhettä!
      Kotimaiset julkkisjuorut
      147
      2589
    2. En kai koskaan saa sinua

      Koska et usko että riitäisit minulle. Olet aina pitänyt itseäsi liian risana ja heikkona. Katkot korkeutesi, ja poraat k
      Ikävä
      154
      1659
    3. Terveystalon lääkärit ylilaskuttaneet

      Tämän pörriäiset osaavat, laskuttamisen. Terveystalo myöntää asian. https://www.hs.fi/suomi/art-2000011134269.html "K
      Maailman menoa
      133
      1633
    4. Saran ökytyyli käänsi katseita.

      On nyt kyllä Sara kasvoistaan, kuvan perusteella todellakin pyöristynyt ainakin kuvan perusteella.
      Kotimaiset julkkisjuorut
      149
      1358
    5. Nyt on aika laittaa parit selkoon.

      Onko pareja täällä. Laita kirjaimet kuka tykkää kenestäkin ?
      Ikävä
      66
      1338
    6. The Summit Suomi: Maxie avaa hyytävästä tilanteesta kuvauksissa: "Veri roiskui ja tajusi, että..."

      Oletko seurannut The Summit Suomea? Tykkäätkö vai et tai mitä mieltä ylipäätään olet sarjasta? Moni katsoja on kaikonnut
      Tv-sarjat
      13
      1180
    7. Työttömille lusmuille luvassa lisää keppiä

      Hallitus aikoo kiristää velvoitteiden laiminlyönnistä seuraavia työttömyysturvan karensseja ensi vuodesta alkaen. Hall
      Maailman menoa
      282
      1165
    8. Ootko huomannut miten

      pursuat joka puolelta. Sille joka luulee itsestään liikoja 🫵🙋🏻‍♂️
      Ikävä
      156
      976
    9. Miksi ihmeessä?

      Erika Vikman diskattiin, ei osallistu Euroviisuihin – tilalle Gettomasa ja paluun tekevä Cheek
      Ateismi
      22
      924
    10. Tiedän kaiken sinusta ja kaikesta

      Tiedän miten kärsit. Tiedän millanen oikeesti oot. Tiedän miksi valehtelit, tiedän miksi satutit mua. Tiedän mitä tapaht
      Ikävä
      58
      889
    Aihe