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