检查C中的输入是否为整数类型

时间:2010-11-01 19:04:13

标签: c input integer

问题在于我不能使用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)

但这些都没有奏效。

有什么想法吗?

15 个答案:

答案 0 :(得分:36)

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");

答案 1 :(得分:22)

您需要先将输入作为字符串读取,然后解析字符串以查看它是否包含有效的数字字符。如果是,则可以将其转换为整数。

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

答案 2 :(得分:13)

scanf%d转换说明符一起使用会出现以下问题:

  1. 如果输入字符串以有效整数(例如“12abc”)开头,则将从输入流中读取“12”并转换并分配给num和{{1将返回1,因此当您(可能)不应该返回时,您将指示成功;

  2. 如果输入字符串以数字开头,则scanf将不会从输入流中读取任何字符{{ 1}}不会被更改,返回值将为0;

  3. 您没有指定是否需要处理非十进制格式,但如果您必须处理八进制或十六进制格式(0x1a)的整数值,则无法使用。 scanf转换说明符处理十进制,八进制和十六进制格式,但您仍然有前两个问题。

  4. 首先,您需要将输入作为字符串读取(最好使用num)。如果您不允许使用%i,则可能不允许您使用fgets。所以你需要检查字符串中的每个字符。检查数字值的安全方法是使用atoi库函数(还有strtolisdigit函数分别用于检查八进制和十六进制数字),例如

    isodigit

    (如果您甚至不允许使用isxdigitwhile (*input && isdigit(*input)) input++; isdigit,那么请打击您的老师/教授,使其完成比实际需要更难的任务) 。

    如果您需要能够处理八进制或十六进制格式,那么它会变得更复杂一些。 C约定是八进制格式具有前导isodigit数字,十六进制格式具有前导isxdigit。因此,如果第一个非空白字符为0,则必须先检查下一个字符,然后才能知道要使用哪种非十进制格式。

    基本概要是

    1. 如果第一个非空白字符不是' - ','+','0'或非零十进制数字,那么这不是有效的整数字符串;
    2. 如果第一个非空白字符是' - ',那么这是一个负值,否则我们假设一个正值;
    3. 如果第一个字符是'+',那么这是一个正值;
    4. 如果第一个非空白字符和非符号字符是非零十进制数字,则输入为十进制格式,您将使用0检查剩余字符;
    5. 如果第一个非空白字符和非符号字符为'0',则输入为八进制或十六进制格式;
    6. 如果第一个非空格和非符号字符为'0'且下一个字符是从'0'到'7'的数字,则输入为八进制格式,您将使用{{1检查剩余的字符;
    7. 如果第一个非空白字符和非符号字符为0且第二个字符为0xisdigit,则输入采用十六进制格式,您将使用isodigit检查剩余的字符;
    8. 如果任何剩余字符不满足上面指定的检查功能,则这不是有效的整数字符串。

答案 3 :(得分:4)

首先问问自己 如何 返回一个整数:

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

您将变量指定为整数类型,然后指定scanf,但仅指定表示整数(%d)。

此时还有什么可能包含的内容?

答案 4 :(得分:1)

如果其他人提出这个问题,我已经编写了一个程序,如果用户输入的不是整数,则不断要求输入一个数字,并在接受一个整数时完成

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

bool digit_check(char key[])
{
    for(int i = 0; i < strlen(key); i++)
    {
        if(isdigit(key[i])==0)
        {
            return false;
        }
    }
    return true;
}

void main()
{
    char stroka[10];
    do{
        printf("Input a number: ");
        scanf("%s",stroka);}
    while (!digit_check(stroka));
    printf("Number is accepted, input finished!\n");
    system("pause");
}

答案 5 :(得分:0)

我查看了上面每个人的输入,这非常有用,并且创建了一个适合我自己的应用程序的功能。该函数实际上只是评估用户的输入不是“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 :(得分:0)

试试这个......

#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 :(得分:0)

我猜这是一个更加用户友好的一个:

#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 :(得分:0)

我使用gets和远离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 :(得分:0)

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

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

scanf()返回匹配的格式说明符数,因此如果输入的文本不能解释为十进制整数,则返回零

答案 10 :(得分:-1)

我一直在寻找一个更简单的解决方案,只使用循环和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;
}

答案 11 :(得分:-1)

此方法适用于除零之外的所有内容(整数甚至双精度)(它将其称为无效):

while循环仅用于重复的用户输入。基本上它会检查整数x / x是否为1.如果是(如同数字一样),则为整数/双精度。如果它没有,显然它不是。 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;
    }
}

答案 12 :(得分:-1)

只需检查您的号码是否与浮动版本有所不同。

float num; 
scanf("%f",&num);

if(num != (int)num) {
    printf("it's not an integer");
    return;
}

答案 13 :(得分:-2)

我遇到了同样的问题,终于找到了要做的事情:

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

答案 14 :(得分:-3)

我找到了一种使用atoi()函数检查给定输入是否为整数的方法。

以字符串形式读取输入,并使用atoi()函数将字符串转换为整数。

如果输入字符串包含整数,则

atoi()函数返回整数,否则返回0.您可以检查atoi()函数的返回值,以了解给定的输入是否为整数。

还有很多函数可以将字符串转换为long,double等。检查标准库&#34; stdlib.h&#34;更多。

注意:它仅适用于非零数字。

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