Portál AbcLinuxu, 8. května 2025 00:15
A když ho budeš nutit zapsat 32 bitů do bajtu, tak to tam klidně zapíše??
$ gcc -Wall -c scanftest.c scanftest.c: In function ‘main’: scanftest.c:7:10: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘unsigned char *’ [-Wformat=] scanf("%d",&c); ~^ ~~ %hhdNo keď budeš ignorovať warningy, tak sa nečuduj. Inými slovami: vieš ukázať správne napísané volanie scanf(), pri ktorom sa nedozvieš, že došlo k chybe, alebo že sa zapisuje na nesprávne miesto v pamäti?
kterému se budou vstupní data předávat z příkazového řádku - stdin
Jen pro pořádek: příkazový řádek a stdin jsou dvě různé věci.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <math.h> typedef struct Numbers Numbers; struct Numbers { size_t n; size_t cap; double *nums; }; enum { MAXLINE = 100, INIT = 1, GROW = 2 }; void addnumber(double num, Numbers *p); int estrtod(char *line, double *num); int main() { char line[MAXLINE]; double number; Numbers ns; int i; ns.nums = NULL; while (fgets(line, MAXLINE, stdin) != NULL) { line[strlen(line)-1] = '\0'; if (estrtod(line, &number)) addnumber(number, &ns); } printf("\n"); for (i = 0; i < ns.n; i++) printf("%0.2f\n", ns.nums[i]); free(ns.nums); return 0; } void addnumber(double num, Numbers *p) { double *t; if (p->nums == NULL) { p->nums = malloc(INIT * sizeof(double)); p->n = 0; p->cap = INIT; } else if (p->n == p->cap) { t = realloc(p->nums, GROW * p->cap * sizeof(double)); p->cap *= GROW; p->nums = t; } p->nums[p->n] = num; p->n++; } int estrtod(char *line, double *num) { char *endptr; if (*line == '\0') return 0; errno = 0; *num = strtod(line, &endptr); if (errno == ERANGE || *endptr != '\0') { printf("error number: %s\n", line); return 0; } return 1; }
58 45.236 abc666 error number: abc666 22xyz error number: 22xyz 22222222222222222222222222222 400 58.00 45.24 22222222222222223739180810240.00 400.00Bohužel mi strtod nenastavuje errno na ERANGE při zadání příliš vysokého čísla, přičemž strtol mi funguje normálně. Možná chyba v linuxu, možná mezi počítačem a židlí, nevím. Tohle je jen takový nástřel, ještě by bylo vhodné ošetřit chyby u malloc a realloc, mít na výpis čísel vlastní funkci, rozdělit vše do souborů atd. Psát tohle v C je docela nepraktické.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.