Подтвердить что ты не робот

Проверьте, является ли ввод целым типом в C

Уловка заключается в том, что я не могу использовать 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)

но никто из них не работал.

Любые идеи?

4b9b3361

Ответ 1

num всегда будет содержать целое число, так как оно int. Реальная проблема с вашим кодом заключается в том, что вы не проверяете возвращаемое значение scanf. scanf возвращает количество успешно прочитанных элементов, поэтому в этом случае он должен возвращать 1 для допустимых значений. Если нет, было введено недопустимое целочисленное значение, и переменная num, вероятно, не изменилась (т.е. Все еще имеет произвольное значение, потому что вы ее не инициализировали).

По состоянию на ваш комментарий вы хотите, чтобы пользователь вводил целое число, а затем клавишу ввода. К сожалению, это не может быть достигнуто просто scanf("%d\n"), но вот трюк для этого:

int num;
char term;
if(scanf("%d%c", &num, &term) != 2 || term != '\n')
    printf("failure\n");
else
    printf("valid integer followed by enter key\n");

Ответ 2

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

char s[MAX_LINE];

valid = FALSE;
fgets(s, sizeof(s), stdin);
len = strlen(s);
while (len > 0 && isspace(s[len - 1]))
    len--;     // strip trailing newline or other white space
if (len > 0)
{
    valid = TRUE;
    for (i = 0; i < len; ++i)
    {
        if (!isdigit(s[i]))
        {
            valid = FALSE;
            break;
        }
    }
}

Ответ 3

Существует несколько проблем с использованием scanf с помощью спецификатора преобразования %d для этого:

  • Если входная строка начинается с допустимого целого числа (например, "12abc" ), тогда "12" будут считаны из входного потока и преобразованы и назначены на num, а scanf вернется 1, поэтому вы укажете успех, когда вы (вероятно) не должны;

  • Если строка ввода не начинается с цифры, то scanf не будет читать символы из входного потока, num не будет изменен, а возвращаемое значение будет 0;

  • Вы не указываете, нужно ли обрабатывать не десятичные форматы, но это не сработает, если вам нужно обрабатывать целочисленные значения в восьмеричных или шестнадцатеричных форматах (0x1a). Спецификатор преобразования %i обрабатывает десятичные, восьмеричные и шестнадцатеричные форматы, но у вас все еще есть первые две проблемы.

Прежде всего, вам нужно будет прочитать ввод как строку (желательно используя fgets). Если вам не разрешено использовать atoi, вам, вероятно, не разрешено использовать strtol. Поэтому вам нужно будет изучить каждый символ в строке. Безопасный способ проверки значений цифр - использовать библиотечную функцию isdigit (есть функции isodigit и isxdigit для проверки восьмеричных и шестнадцатеричных цифр соответственно), например

while (*input && isdigit(*input))
   input++;    

(если вам даже не разрешено использовать isdigit, isodigit или isxdigit, то удалите своего учителя/профессора, чтобы сделать назначение сложнее, чем это действительно должно быть).

Если вам нужно иметь возможность обрабатывать восьмеричные или шестнадцатеричные форматы, это становится немного сложнее. Соглашение C для восьмеричных форматов имеет ведущую цифру 0, а для шестнадцатеричных форматов - ведущий 0x. Итак, если первый символ без пробелов равен 0, вы должны проверить следующий символ, прежде чем сможете узнать, какой формат не десятичного числа использовать.

Основной контур

  • Если первый символ без пробелов не является символом '-', '+', '0' или отличным от нуля десятичным значком, то это не допустимая целая строка;
  • Если первым символом без пробела является "-", то это отрицательное значение, иначе мы принимаем положительное значение;
  • Если первый символ "+", то это положительное значение;
  • Если первый символ без пробелов и знаков без знака является отличной от нуля десятичной цифрой, тогда вход находится в десятичном формате, и вы будете использовать isdigit для проверки оставшихся символов;
  • Если первый символ без пробелов и символов без знака равен '0', то вход находится в восьмеричном или шестнадцатеричном формате;
  • Если первый символ без пробелов и символов без знака был "0", а следующий символ - цифрой от "0" до "7", тогда вход будет в восьмеричном формате, и вы будете использовать isodigit для проверки оставшихся символов;
  • Если первый символ без пробела и не знака был 0, а второй символ x или x, то вход в шестнадцатеричном формате, и вы будете использовать isxdigit для проверки оставшихся символов;
  • Если какой-либо из оставшихся символов не удовлетворяет указанной выше функции проверки, то это не допустимая целая строка.

Ответ 4

Сначала спросите себя, как бы вы когда-либо ожидали, что этот код будет NOT возвращать целое число:

int num; 
scanf("%d",&num);

Вы указали переменную как целое число, а затем scanf, но только для целого числа (%d).

Что еще он может содержать в этой точке?

Ответ 5

Я просмотрел все введенные выше данные, что было очень полезно, и сделало функцию, которая подходит для моего собственного приложения. Функция действительно только оценивает, что пользовательский ввод не является "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;
}

Ответ 6

Попробуйте это...

#include <stdio.h>

int main (void)
{
    float a;
    int q;

    printf("\nInsert number\t");
    scanf("%f",&a);

    q=(int)a;
    ++q;

    if((q - a) != 1)
        printf("\nThe number is not an integer\n\n");
    else
        printf("\nThe number is an integer\n\n");

    return 0;
}

Ответ 7

Это более удобный для пользователя вариант:

#include<stdio.h>

/* This program checks if the entered input is an integer
 * or provides an option for the user to re-enter.
 */

int getint()
{
  int x;
  char c;
  printf("\nEnter an integer (say -1 or 26 or so ): ");
  while( scanf("%d",&x) != 1 )
  {
    c=getchar();

    printf("You have entered ");
    putchar(c);
    printf(" in the input which is not an integer");

    while ( getchar() != '\n' )
     ; //wasting the buffer till the next new line

    printf("\nEnter an integer (say -1 or 26 or so ): ");

  }

return x;
}


int main(void)
{
  int x;
  x=getint();

  printf("Main Function =>\n");
  printf("Integer : %d\n",x);

 return 0;
}

Ответ 8

Я разработал эту логику, используя get и away from htt s scanf:

void readValidateInput() {

    char str[10] = { '\0' };

    readStdin: fgets(str, 10, stdin);
    //printf("fgets is returning %s\n", str);

    int numerical = 1;
    int i = 0;

    for (i = 0; i < 10; i++) {
        //printf("Digit at str[%d] is %c\n", i, str[i]);
        //printf("numerical = %d\n", numerical);
        if (isdigit(str[i]) == 0) {
            if (str[i] == '\n')break;
            numerical = 0;
            //printf("numerical changed= %d\n", numerical);
            break;
        }
    }
    if (!numerical) {
        printf("This is not a valid number of tasks, you need to enter at least 1 task\n");
        goto readStdin;
    }
    else if (str[i] == '\n') {
        str[i] = '\0';
        numOfTasks = atoi(str);
        //printf("Captured Number of tasks from stdin is %d\n", numOfTasks);
    }
}

Ответ 9

printf("type a number ");
int converted = scanf("%d", &a);
printf("\n");

if( converted == 0) 
{
    printf("enter integer");
    system("PAUSE \n");
    return 0;
}

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

Ответ 10

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

#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;
}

Ответ 11

Я искал более простое решение, используя только циклы и операторы 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;
}

Ответ 12

Этот метод работает для всего (целые числа и даже удваивает), кроме нуля (он называет его недействительным):

Цикл while предназначен только для повторного ввода пользователем. В основном, он проверяет, является ли целое число x/x = 1. Если он делает (как и для числа), его целое число /double. Если это не так, очевидно, это не так. Однако Zero терпит неудачу.

#include <stdio.h> 
#include <math.h>

void main () {
    double x;
    int notDouble;
    int true = 1;
    while(true) {
        printf("Input an integer: \n");
        scanf("%lf", &x);
        if (x/x != 1) {
            notDouble = 1;
            fflush(stdin);
        }
        if (notDouble != 1) {
            printf("Input is valid\n");
        }
        else {
            printf("Input is invalid\n");
        }
        notDouble = 0;
    }
}

Ответ 13

Я нашел способ проверить, является ли данный ввод целым числом или нет с помощью функции atoi().

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

Функция atoi() возвращает целое число, если входная строка содержит целое число, иначе она вернет 0. Вы можете проверить возвращаемое значение функции atoi(), чтобы узнать, является ли данный ввод целым числом или нет.

Есть намного больше функций для преобразования строки в long, double и т.д., проверьте стандартную библиотеку "stdlib.h" для получения дополнительной информации.

Примечание: работает только для ненулевых чисел.

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

int main() {
    char *string;
    int number;

    printf("Enter a number :");
    string = scanf("%s", string);

    number = atoi(string);

    if(number != 0)
        printf("The number is %d\n", number);
    else
        printf("Not a number !!!\n");
    return 0;
}