— 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 <stdio.h> 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 4294967286Hodnota 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.