— Jan Faigl 2025/09/19 19:04
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.