Как ограничить пользователя только вводом целого числа и отказом от любых других символов в scanf? - PullRequest
0 голосов
/ 19 ноября 2011

Я пытаюсь получить пользовательский ввод и разрешить им вводить только целое число, которое также является положительным.

Я пытаюсь понять эту задачу

printf("Enter the first and second number in whole number: ");
scanf("%d,%d", &first, &second);

if (input != '\n') //notice this line I'm trying to check if is a character//
    printf("Error! CHARACTER NOT ACCEPTED!!\n");

else if (First <= 0)
    printf("Error! First must be a positive value!\n");

else if (Second <= 0)
    printf("Error Second must be a positive value!\n");

Код выше проверит две вещи. Во-первых, если пользователь ввел символы, которые я хочу. Во-вторых, если число положительное.

Как мне реализовать эти проверки?

Ответы [ 5 ]

2 голосов
/ 19 ноября 2011

Считайте ввод как текст, затем преобразуйте в целое число, используя strtol:

int val;
char inbuf[SIZE]; // where SIZE is long enough to handle expected inputs
...
if (fread(inbuf, sizeof inbuf, stdin) != NULL)
{
  char *chk;
  val = (int) strtol(inbuf, &chk, 10);
  if (!isspace(*chk) && *chk != 0)
    printf("%s is not a valid integer value\n", inbuf);
}

strtol прочитает строку в inbuf и преобразует ее в эквивалентное целочисленное значение.chk будет указывать на первый символ в inbuf, который не будет преобразован.Если этот символ не является пробелом или 0, то строка не была допустимым целым числом.

2 голосов
/ 19 ноября 2011

Не используйте scanf! Просто прочитайте ввод и затем вызовите strtoul со вторым аргументом и убедитесь, что значение, возвращаемое во втором аргументе, равно «\ 0».

2 голосов
/ 19 ноября 2011

Считать целую строку (с getline), затем преобразовать ее в число, возможно, используя strtol (и проверить указатель конца).

Или использовать формат %n для scanf и проверьте число (успешных конверсий), возвращаемое scanf

1 голос
/ 19 ноября 2011

Вы не можете ограничивать символы, вводимые пользователем. Вы должны прочитать все, что пользователь дает вам, и решить, что с ним делать.

Если вы хотите использовать scanf, это может быть так:

int ret = scanf("%d", &num);
Возвращаемое значение

scanf показывает количество % s, которые оно успешно прочитало. Например:

12      <-- this input returns 1, num will be 12
asd     <-- this input returns 0, num will be untouched
123xf   <-- this input returns 1, num will be 123

В последнем примере xf останется на входе, и далее scanf s прочитает его.

Таким образом, для первого if вы просто проверяете, является ли возвращаемое значение scanf равным 1. Если нет, то вы не можете прочитать число из ввода.

Для второго if проверьте, если num <= 0

1 голос
/ 19 ноября 2011

Полагаю, вам нужно что-то вроде этого:

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

int main ()
{
  int i;
  char szInput [256];

   printf ("Enter a number: ");
   fgets ( szInput, 256, stdin );
   i = atoi (szInput);
   if(i<0)
   printf("Error! Input must be a positive value!");


   else{

        //Do the rest

       }
   return 0;
}

Обратите внимание, что atoi() ожидает строковое представление десятичного числа, в случае, если он получает символ, он возвращает 0, поэтому вам нужнобольше не заботиться о персонажах!

РЕДАКТИРОВАТЬ:

С некоторыми исследованиями я обнаружил, что лучше использовать Strtol () , чем atoi ().См. Это для уточнения: Почему бы не использовать atoi ()

...