5. Ukazatele, dynamická alokace, práce s textem

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

courses/b0b36prp/lectures/lec05.txt · Last modified: 2025/09/19 19:04 by faiglj