Advertisement
VisualPaul

read integer

Dec 6th, 2014
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.02 KB | None | 0 0
  1. #include <ctype.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5. /* читает число из f в result.
  6. ** В случае ошибки возвращает 1
  7. ** В случае конца файла -1
  8. ** Читает число до первого пробельного символа*/
  9. int read_integer(FILE *f, int *result) {
  10.     int state = 0;
  11.     int sign = +1;
  12.     for (;;) {
  13.         int c = getc(f);
  14.         if (state == 0) {
  15.             /* типа в начале числа */
  16.             if (c != EOF && isspace(c)) {
  17.                 continue;
  18.             } else if (c == EOF) {
  19.                 return -1;
  20.             } else if (isdigit(c)) {
  21.                 *result = c - '0';
  22.                 state = 1;
  23.             } else if (c == '+') {
  24.                 *result = 0;
  25.                 sign = +1;
  26.                 state = 2;
  27.             } else if (c == '-') {
  28.                 *result = 0;
  29.                 sign = -1;
  30.                 state = 2;
  31.             } else {
  32.                 ungetc(c, f);
  33.                 return 1; /* что это было? */
  34.             }
  35.         } else if (state == 1) {
  36.             /* типа внутри числа. Число может кончиться прямо в этом месте */
  37.             if (c != EOF && isdigit(c)) {
  38.                 *result = 10 * *result + (c - '0') * sign;
  39.             } else if (c == EOF || isspace(c)) {
  40.                 ungetc(c, f);
  41.                 return 0;
  42.             } else {
  43.                 ungetc(c, f);
  44.                 return 1;
  45.             }
  46.         } else if (state == 2) {
  47.             /* Сразу после + или - Хоть одина цифра должна быть */
  48.             if (c != EOF && isdigit(c)) {
  49.                 *result = 10 * *result + (c - '0') * sign;
  50.                 state = 1;
  51.             } else {
  52.                 ungetc(c, f);
  53.                 return 1;
  54.             }
  55.         } else {
  56.             fprintf(stderr, "unknown state: %d\n", state);
  57.             abort();
  58.         }
  59.     }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement