C: Как установить собственный целочисленный диапазон, строго ограничивая допустимые номера ввода только в этом диапазоне?

Рассмотрим случай, когда программа должна принимать число в качестве ввода от пользователя, только в пределах строгого диапазона от 1 до 10 000 000 000? Возможно ли это в C? Если да, было бы хорошо, если бы кто-нибудь мог это объяснить, внося изменения в следующую примерную программу.

#include
int main()
{
    unsigned long int n, e1,e2,e3;
    int counter;

    for(counter=0; counter<10; counter++)
    {

        scanf("%ld",&n);//how to restrict this between 1 to 10,000,000,000?

        e1=n/2;
        e2=n/3;
        e3=n/4;

        if(e1+e2+e3
1
nl ja de
Вы имеете в виду entry время? или при проверке времени? Последний - если-то, то первое будет больше проблем, чем его ценность.
добавлено автор WhozCraig, источник
Да. Что вы еще пробовали?
добавлено автор junix, источник
Просто добавьте условие if после scanf , чтобы проверить введенное пользователем значение.
добавлено автор sgarizvi, источник

3 ответы

Вы можете заменить:

scanf ("%ld",&n);

с чем-то вроде:

scanf ("%lu", &n);
while ((n < 1) || (n > 10 * 1000 * 1000 * 1000)) {
    printf ("No! That won't do, try again!\n");
    scanf ("%lu", &n);
}
1
добавлено

Ваш верхний предел, 10 000 000 000 (десять миллиардов), довольно большой. Он не будет вписываться в 32-разрядное целое без знака, вам нужно что-то большее.

Поэтому, поскольку вы знаете фактическое число, которое вам нужно поддерживать, лучше использовать явные 64-битные номера (вместо того, чтобы надеяться, что ваш код unsigned long long достаточно большой).

Для этого потребуется C99:

#include 

uint64_t n;

if(scanf("%" PRIu64, &n) == 1)
{
  if(n >= 1 && n <= UINT64_C(10000000000))
   printf("Great, number accepted\n");
  else
   printf("Please enter a number in range 1..10000000000\n");
}
else
  printf("Please enter a number.\n");

Очевидно, что это не полная программа.

1
добавлено

Вы не можете. Не прямо в любом случае, за одним исключением: разрешить подписанные или неподписанные значения b y используя форматы "% lu" для неподписанных значений и "% ld" для подписанных.

Для проверки того, имеет ли вход ограничения, вы должны прочитать ввод, проверить его на свои лимиты, а если и снаружи, попросите пользователя снова.

0
добавлено