检查input是否是C中的整数types

问题是我不能使用atoi或者其他任何函数(我敢肯定,我们应该依靠math运算)。

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) 

但没有一个工作。

有任何想法吗?

num将始终包含一个整数,因为它是一个int 。 你的代码真正的问题是你不检查scanf返回值。 scanf返回成功读取的项目数,所以在这种情况下,它必须返回1作为有效值。 如果不是,input一个无效的整数值,并且numvariables可能不会被改变(即仍然有一个任意的值,因为你没有初始化它)。

至于你的评论,你只想让用户input一个整数,然后按回车键。 不幸的是,这不能简单地通过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"); 

你需要首先读取你的input作为string,然后parsingstring,看它是否包含有效的数字字符。 如果这样做,那么你可以将其转换为一个整数。

 char s[MAX_LINE]; fgets(s, sizeof(s), stdin); valid = TRUE; for (i = 0; i < strlen(s); ++i) { if (!isdigit(s[i])) { valid = FALSE; break; } } 

使用scanf%d转换说明符执行此操作有几个问题:

  1. 如果inputstring以一个有效的整数(例如“12abc”)开始,那么将从inputstream中读取“12”并转换并分配给numscanf将返回1,所以当你(可能)不应该;

  2. 如果input的string不是以数字开头,那么scanf将不会从inputstream中读取任何字符, num不会被改变,返回值是0;

  3. 您不指定是否需要处理非十进制格式,但如果必须处理八进制或hex格式(0x1a)的整数值,则这不起作用。 %i转换说明符处理十进制,八进制和hex格式,但您仍然有前两个问题。

首先,你需要将input作为string读取(最好使用fgets )。 如果你不允许使用atoi ,你可能也不允许使用strtol 。 所以你需要检查string中的每个字符。 检查数字值的安全方法是使用isdigit库函数(也有分别检查八进制和hex数字的isodigitisxdigit函数),如

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

(如果你甚至没有被允许使用isdigitisodigitisxdigit ,那么打你的老师/教授让分配比实际需要更难)。

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

基本大纲是

  1. 如果第一个非空白字符不是“ – ”,“+”,“0”或非零十进制数字,则这不是有效的整数string;
  2. 如果第一个非空白字符是' – ',那么这是一个负值,否则我们假设一个正值;
  3. 如果第一个字符是“+”,那么这是一个正值;
  4. 如果第一个非空白和非符号字符是非零十进制数字,那么input是十进制格式,您将使用isdigit来检查其余字符;
  5. 如果第一个非空白和非符号字符是“0”,那么input是八进制或hex格式;
  6. 如果第一个非空白和非符号字符是“0”,下一个字符是从“0”到“7”的数字,那么input是八进制格式,您将使用isodigit来检查其余字符;
  7. 如果第一个非空白和非符号字符是0,第二个字符是xX ,那么input是hex格式,您将使用isxdigit来检查其余字符;
  8. 如果其余字符中的任何一个不符合上面指定的检查函数,则这不是有效的整数string。

首先问问你自己如何期望这个代码返回一个整数:

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

你指定的variablestypes为整数,然后你scanf ,但为一个整数( %d )。

还有什么可能包含在这一点上?

尝试这个…

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

我遇到了同样的问题,终于弄清楚该怎么做:

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

我一直在寻找一个简单的解决scheme,只使用循环和if语句,这就是我想出的。 该程序也可以使用负整数,并正确拒绝任何可能包含整数和其他字符的混合input。


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

我查看了上面的每个人的input,这是非常有用的,并提出了一个适合我自己的应用程序的function。 该函数实际上只是评估用户的input不是“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; } 

这个方法适用于除零之外的任何事情(整数甚至双精度)(它称之为无效):

while循环仅用于重复的用户input。 基本上它检查是否整数x / x = 1。如果它(如同一个数字),它是一个整数/双。 如果没有,那显然不是。 零虽然没有通过testing。

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

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

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

我开发这个逻辑使用get和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); } } 
 printf("type a number "); int converted = scanf("%d", &a); printf("\n"); if( converted == 0) { printf("enter integer"); system("PAUSE \n"); return 0; } 

scanf()返回匹配的格式说明符的数目,如果input的文本不能被解释为十进制整数

我find了一种方法来检查给定的input是否是一个整数或不使用atoi()函数。

以stringforms读取input,并使用atoi()函数将string转换为整数。

如果inputstring包含整数,atoi()函数将返回整数,否则返回0.您可以检查atoi()函数的返回值,以确定给定的input是否为整数。

将string转换为long,double等函数的function很多,请检查标准库“stdlib.h”以获取更多信息。

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

 #include<stdio.h> #include<stdlib.h> int main() { char *string; int number; printf("Enter a number :"); scanf("%s", string); number = atoi(string); if(number != 0) printf("The number is %d\n", number); else printf("Not a number !!!\n"); return 0; }