Mitä tarkoittaa merkkitaulukko?

katso otsikkoa
31298
Äänestä

Muut lukivat myös

Vastaukset 3

Vanhimmat

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

Äänestä
  • 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ä).

    Äänestä

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

    Äänestä

Kommentoi aloitusta


sdfd kirjoitti:

katso otsikkoa

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu