Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ctype.h>
- #include <stdlib.h>
- #include <stdio.h>
- /* читает число из f в result.
- ** В случае ошибки возвращает 1
- ** В случае конца файла -1
- ** Читает число до первого пробельного символа*/
- int read_integer(FILE *f, int *result) {
- int state = 0;
- int sign = +1;
- for (;;) {
- int c = getc(f);
- if (state == 0) {
- /* типа в начале числа */
- if (c != EOF && isspace(c)) {
- continue;
- } else if (c == EOF) {
- return -1;
- } else if (isdigit(c)) {
- *result = c - '0';
- state = 1;
- } else if (c == '+') {
- *result = 0;
- sign = +1;
- state = 2;
- } else if (c == '-') {
- *result = 0;
- sign = -1;
- state = 2;
- } else {
- ungetc(c, f);
- return 1; /* что это было? */
- }
- } else if (state == 1) {
- /* типа внутри числа. Число может кончиться прямо в этом месте */
- if (c != EOF && isdigit(c)) {
- *result = 10 * *result + (c - '0') * sign;
- } else if (c == EOF || isspace(c)) {
- ungetc(c, f);
- return 0;
- } else {
- ungetc(c, f);
- return 1;
- }
- } else if (state == 2) {
- /* Сразу после + или - Хоть одина цифра должна быть */
- if (c != EOF && isdigit(c)) {
- *result = 10 * *result + (c - '0') * sign;
- state = 1;
- } else {
- ungetc(c, f);
- return 1;
- }
- } else {
- fprintf(stderr, "unknown state: %d\n", state);
- abort();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement