katso otsikkoa
Mitä tarkoittaa merkkitaulukko?
sdfd
31298
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
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
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.