Portál AbcLinuxu, 16. července 2025 22:34
char *end; //pouzito pro kontrolu konverze unsigned int pocet_zidli= strtoul(argv[1], &end, 0); if (*end != '\0') {//osetreni vstupu argv[1] fprintf(stderr, "%s\n", chybove_zpravy[CHYBA_ARGV1]); return -1; }zkoušel jsem to takhle. strtoul ale převádí string na unsigned long a já to uložím do unsigned int, je to problém? A pak ještě mi to hází když zadám např -1, nějaké hodně velké číslo, jak to prosím ošetřím děkuji.
char *end; int pocet_zidli= strtoul(argv[1], &end, 0); if (errno == ERANGE || *end != '\0' || pocet_zidli < 0) {//osetreni vstupu argv[1] fprintf(stderr, "%s\n", chybove_zpravy[CHYBA_ARGV]); return -1; }btw nejsou nekde man. stranky v CZ, angličtinu neovladam a resim skolni projekt s procesy a vubec nevim kde hledat info :/ jak zacit. Pritom pri prihlasovani na Bc. nikde nebylo psano, ze vsechno bude v AJ, kdyz se anglictina vyucuje az na Bc. To uz je jina kapitola..
strtoul
převádí na unsigned long
, nikoliv unsigned int
. Pokud to rovnou převedete na unsigned int
, nemáte šanci detekovat přetečení mezi UINT_MAX
a ULONG_MAX
. Takže lépe si takto nadefinujte strtoui
:
int strtoui(const char *str, char **end, int base) { unsigned long l = strtoul(str, end, base); if (l > UINT_MAX) { errno = ERANGE; return UINT_MAX; } return l; }A nezapomeňte na to, že
strtoul
nemaže errno
, pokud nedošlo k chybě, takže si jej před jejím voláním vymažte, tedy volání by mělo vypadat nějak takto:
char *end; errno = 0; unsigned int pocet_zidli = strtoui(argv[1], &end, 0); if (errno == ERANGE || *end != 0) { // Chyba }
man strtoul
:
Negative values are considered valid input and are silently converted to the equivalent unsigned long int value.Takže řešení je použít
strtol
(strtoll
pokud chcete celý rozsah unsigned long
) a ošetřit obě meze.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.