problem v C

Jiří Foldyna jiri.f
Středa Březen 17 12:05:03 CET 2004


> Diky, tento posledni prispevek, ma pro me asi nejvetsi vahu. Jsem v C
> zacatecnik, a navic samouk (je az divny, kolik mi toho
> funguje). Mam dve
> knizky, ktere tak navzajem konzultuju.
> Lepsi tedy bude: static string menu1[3]={"blabla
> ","blablabla","huiiii
> "}; ?
> To asi taky neni ono. Poradte prosim jak na to. Ta NULL na
> konci by asi
> pomohla, ale neni neco programatorsky cistsiho (inicalizovat tak, aby
> kompilator vedel, ze jde o retezec a vrazil tam ty nuly sam)?

Ahoj,

pokusim se o malinky uvod do stringovych literalu a inicializovanych
konstant.

1. Za retezec se v Ccku povazuje pole znaku indexovane od nuly a ukoncene
terminatorem stringu (0x00). Funkce, ktere s retezci pracuji, s tim
pocitaji, a napr. funkce printf() bude vypisovat znaky, dokud na terminator
nenarazi.

2. Pokud potrebujes kompilatoru rici, ze chces, aby pole znaku inicializoval
na nejakou hodnotu, napises

char name[] = {"Jmeno"};

Kompilator vytvori pole o delce 6 znaku, kde name[0] = 'J', name[1] =
'm',..., name[5] = 0x00.

Pokud ovsem pouzijes konstrukci

char name[5] = {"Jmeno"};

tak kompilator bud zarve (to zalezi na prekladaci, pripadne na nastaveni
parametru prekladu) nebo inicializuje pole pouze tolika znaky, kolik se mu
tam vejde, tedy v tomto pripade name[0] = 'J', name[1] = 'm',..., name[4] =
'o' a na terminator stringu uz mu nezbude misto.

Spravna deklarace by tedy v tvem pripade mela vypadat asi takto:

static char code menu1[3][17]= {"1. INFO         ",
                                "2. Teplota      ",
                                "3. Cas/Datum    "};

tedy 16 znaku pro jednotlive polozky a 1 znak pro terminator stringu.

Pokud bys nepotreboval zarovnat text na pevnou delku (nepotrebujes mezery za
textem), staci tato deklarace:

static char code menu1[3][17]= {"1. INFO",
                                "2. Teplota",
                                "3. Cas/Datum"};

V kazdem pripade se ovsem musis postarat, aby inicializacni stringovy
literal (fuj, to je hnusny nazev, ale lip to rict neumim) nebyl i s koncovym
terminatorem stringu delsi nez max delka polozky pole.

Doufam, ze jsem se vyjadril jasne (jsem ucitel na baterky :-)))))).

Ing. Jiri Foldyna
mailto:jiri.f@avizo.cz








Další informace o konferenci Hw-list