===== 5. Ukazatele, dynamická alokace, práce s textem ===== * prezentace: {{courses:b0b36prp:lectures:b0b36prp-lec05-slides.pdf|}} * zkrácená verze: {{courses:b0b36prp:lectures:b0b36prp-lec05-handout.pdf|}} * zkrácená verze 2x2: {{courses:b0b36prp:lectures:b0b36prp-lec05-handout-2x2.pdf|}} * zkrácená verze 3x3: {{courses:b0b36prp:lectures:b0b36prp-lec05-handout-3x3.pdf|}} * přiložené demonstrační programy: {{courses:b0b36prp:lectures:b0b36prp-lec05-codes.zip|}} --- //[[faiglj@fel.cvut.cz|Jan Faigl]] 2025/10/21 23:00// **Dotazy z přednášky** Q: //Snažím se načíst celé číslo do typu ''unsigned int'' funkcí ''scanf()'' a když dám na vstup celé záporné číslo, např. -10, nejen, že se hodnota načte, ale hodnota je veliká. Jak je to možné?// Minimální kód programu ''read_unsigned.c'' může být například: #include int main(void) { unsigned int i; int r = scanf("%+u", &i); printf("Return value %i read value %u\n", r, i); return 0; } Výstup pak například clang read_unsigned.c && echo "-10" | ./a.out Return value 1 read value 4294967286 Hodnota 4294967286 odpovídající maximálním hodnotě typu ''unsigned int'' bez 10 vyplývá z použití doplňkového kódu. Program nemá zřejmé očekávané chování. Při bližším pohledu na chování funkce ''scanf()'', např. ''man scanf'' NAME scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf — input format conversion LIBRARY Standard C Library (libc, -lc) ... u Matches an optionally signed decimal integer; the next pointer must be a pointer to unsigned int. ... se dočteme, že konverze přes ''"%u"'' načítá znamenkový ''integer''. Funkce se tak chová dle dokumentace. V případě, že bychom se chtěli vyhnout takovému chování můžeme buď použití větší datový typ, např. ''unsigned long'', a kontrolovat rozsah pro ''unsigned int'' nebo si napsat vlastní načítání pouze kladných hodnot a při výskytu znaku '''-''' na vstupu indikovat špatný vstup.