Проверьте, является ли ввод целочисленным типом в C - PullRequest
28 голосов
/ 01 ноября 2010

Смысл в том, что я не могу использовать atoi или любую другую функцию, подобную этой (я почти уверен, что мы должны полагаться на математические операции).

 int num; 
 scanf("%d",&num);
 if(/* num is not integer */) {
  printf("enter integer");
  return;
 }

Я пробовал:

(num*2)/2 == num
num%1==0
if(scanf("%d",&num)!=1)

но ничего из этого не сработало.

Есть идеи?

Ответы [ 13 ]

0 голосов
/ 02 ноября 2014

Я просмотрел все данные выше, которые были очень полезны, и сделал функцию, подходящую для моего собственного приложения. Функция действительно только оценивает, что пользовательский ввод не является "0", но он был достаточно хорош для моих целей. Надеюсь, это поможет!

#include<stdio.h>

int iFunctErrorCheck(int iLowerBound, int iUpperBound){

int iUserInput=0;
while (iUserInput==0){
    scanf("%i", &iUserInput);
    if (iUserInput==0){
        printf("Please enter an integer (%i-%i).\n", iLowerBound, iUpperBound);
        getchar();
    }
    if ((iUserInput!=0) && (iUserInput<iLowerBound || iUserInput>iUpperBound)){
        printf("Please make a valid selection (%i-%i).\n", iLowerBound, iUpperBound);
        iUserInput=0;
    }
}
return iUserInput;
}
0 голосов
/ 04 октября 2014

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


#include <stdio.h>
#include <stdlib.h> // Used for atoi() function
#include <string.h> // Used for strlen() function

#define TRUE 1
#define FALSE 0

int main(void)
{
    char n[10]; // Limits characters to the equivalent of the 32 bits integers limit (10 digits)
    int intTest;
    printf("Give me an int: ");

    do
    {        
        scanf(" %s", n);

        intTest = TRUE; // Sets the default for the integer test variable to TRUE

        int i = 0, l = strlen(n);
        if (n[0] == '-') // Tests for the negative sign to correctly handle negative integer values
            i++;
        while (i < l)
        {            
            if (n[i] < '0' || n[i] > '9') // Tests the string characters for non-integer values
            {              
                intTest = FALSE; // Changes intTest variable from TRUE to FALSE and breaks the loop early
                break;
            }
            i++;
        }
        if (intTest == TRUE)
            printf("%i\n", atoi(n)); // Converts the string to an integer and prints the integer value
        else
            printf("Retry: "); // Prints "Retry:" if tested FALSE
    }
    while (intTest == FALSE); // Continues to ask the user to input a valid integer value
    return 0;
}
0 голосов
/ 09 ноября 2013

У меня была такая же проблема, наконец-то понял, что делать:

#include <stdio.h>
#include <conio.h>

int main ()
{
    int x;
    float check;
    reprocess:
    printf ("enter a integer number:");
    scanf ("%f", &check);
    x=check;
    if (x==check)
    printf("\nYour number is %d", x);
    else 
    {
         printf("\nThis is not an integer number, please insert an integer!\n\n");
         goto reprocess;
    }
    _getch();
    return 0;
}
...