Проверьте на возможное переполнение Int от входа - PullRequest
0 голосов
/ 19 февраля 2019

Я уже некоторое время читаю источники, но они всегда говорят о переполнениях при выполнении операций, но как на самом деле проверить потенциальное переполнение int в тот момент, когда оно было введено пользователем, прежде чем его можно будет присвоить идентификатору int?

Я хочу проверить ввод в тот момент, когда он был введен, поэтому, обнаружив, что такое значение уже превысило диапазон значений для данных типа int, я могу остановить его, прежде чем он перейдет к следующей частикода.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Если вы должны читать непосредственно в int, вы не можете проверить наличие переполнения перед назначением.

Есть способы обойти это, если чтение непосредственно в int не является обязательным.Например, вы можете прочитать символьный буфер / строку, а затем проверить, был ли ввод числовым и вписывается ли он в int.Если это так, вы затем конвертируете символьный буфер в целое число, используя стандартные библиотечные функции, и присваиваете свой int.

0 голосов
/ 19 февраля 2019

Вы можете прочитать строку, затем использовать strtol , затем проверить endptr и errno , когда все в порядке, вы можете назначить int var

Подробное использование strtol

#include <stdlib.h>
#include <ctype.h>
#include <errno.h>

int main()
{
  char s[32]; /* 31 characters is surely large enough for an int */

  if (scanf("%31s", s) != 1)
    puts("nok");
  else {
    errno = 0;

    char * endptr;
    long int l = strtol(s, &endptr, 10);

    if (endptr == s)
      puts("no digit");
    else if ((*endptr != 0) && !isspace(*endptr))
      puts("invalid number");
    else if (errno != 0)
      puts("overflow on long");
    else if (((int) l) != l) /* in case long and int do not have the same size */
      puts("overflow on int");
    else
      puts("you enter a valid int");
  }

  return 0;
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out
a 
no digit
pi@raspberrypi:/tmp $ ./a.out
12z
invalid number
pi@raspberrypi:/tmp $ ./a.out
123
you enter a valid int
pi@raspberrypi:/tmp $ ./a.out
12345678901
overflow on long

Так точно ответить на вопрос:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>

int readInt(int * v)
{
  char s[32]; /* 31 characters is surely large enough for an int */

  if (scanf("%31s", s) != 1)
    return 0;
  else {
    errno = 0;

    char * endptr;
    long int l = strtol(s, &endptr, 10);

    if ((endptr == s) ||       /* no digit */
        ((*endptr != 0) && !isspace(*endptr)) || /* e.g. 12a */
        (errno != 0) ||        /* overflow on long */
        (((int) l) != l))      /* overflow on int */
      return 0;

    *v = (int) l;
    return 1;
  }
}


int main()
{
  int v = 123;

  if (readInt(&v))
    printf("new valid in value : %d\n", v);
  else
    printf("unvalid input, still %d\n", v);

  return 0;
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out
12
new valid in value : 12
pi@raspberrypi:/tmp $ ./a.out
9878787878787878
unvalid input, still 123
pi@raspberrypi:/tmp $ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...