How to check if input is a number or not in C?

In the main function of C:

void main(int argc, char **argv) { // do something here } 

At the command line, we will enter any number, for example 1 or 2 , but it will be considered as a char array for the argv parameter, but how to make sure that the input is a number if people typed hello or c ?

+8
source share
6 answers

Another way to do this is to use the isdigit function. Below is the code for it:

 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define MAXINPUT 100 int main() { char input[MAXINPUT] = ""; int length,i; scanf ("%s", input); length = strlen (input); for (i=0;i<length; i++) if (!isdigit(input[i])) { printf ("Entered input is not a number\n"); exit(1); } printf ("Given input is a number\n"); } 
+14
source

You can use a function like strtol() , which converts an array of characters to long.

It has a parameter that allows you to detect the first character that was not converted properly. If this is something other than the end of the line, you have a problem.

Refer to the following program for an example:

 #include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[]) { int i; long val; char *next; // Process each argument given. for (i = 1; i < argc; i++) { // Get value with failure detection. val = strtol (argv[i], &next, 10); // Check for empty string and characters left after conversion. if ((next == argv[i]) || (*next != '\0')) { printf ("'%s' is not valid\n", argv[i]); } else { printf ("'%s' gives %ld\n", argv[i], val); } } return 0; } 

By running this, you can see it in action:

 pax> testprog hello "" 42 12.2 77x 'hello' is not valid '' is not valid '42' gives 42 '12.2' is not valid '77x' is not valid 
+11
source

Using scanf is very simple, this is an example:

 if (scanf("%d", &val_a_tester) == 1)) { ... // it an integer } 
+3
source

Self-similar solution:

 bool isNumeric(const char *str) { while(*str != '\0') { if(*str < '0' || *str > '9') return false; str++; } return true; } 

Please note that this solution should not be used in production code, as it has serious limitations. But I like it for understanding C-Strings and ASCII.

+3
source

Using fairly simple code:

 int i; int value; int n; char ch; /* Skip i==0 because that will be the program name */ for (i=1; i<argc; i++) { n = sscanf(argv[i], "%d%c", &value, &ch); if (n != 1) { /* sscanf didn't find a number to convert, so it wasn't a number */ } else { /* It was */ } } 
+2
source

The sscanf () solution is better in terms of code lines. My answer here is a custom build function that does almost the same thing as sscanf (). Stores the converted number in a pointer and returns a value called "val". If val is output as zero, then the input is in an unsupported format, so no conversion is performed. Therefore, use the pointer value only when val is nonzero.

It only works if the input signal is in base-10 form.

 #include <stdio.h> #include <string.h> int CONVERT_3(double* Amt){ char number[100]; // Input the Data printf("\nPlease enter the amount (integer only)..."); fgets(number,sizeof(number),stdin); // Detection-Conversion begins int iters = strlen(number)-2; int val = 1; int pos; double Amount = 0; *Amt = 0; for(int i = 0 ; i <= iters ; i++ ){ switch(i){ case 0: if(number[i]=='+'){break;} if(number[i]=='-'){val = 2; break;} if(number[i]=='.'){val = val + 10; pos = 0; break;} if(number[i]=='0'){Amount = 0; break;} if(number[i]=='1'){Amount = 1; break;} if(number[i]=='2'){Amount = 2; break;} if(number[i]=='3'){Amount = 3; break;} if(number[i]=='4'){Amount = 4; break;} if(number[i]=='5'){Amount = 5; break;} if(number[i]=='6'){Amount = 6; break;} if(number[i]=='7'){Amount = 7; break;} if(number[i]=='8'){Amount = 8; break;} if(number[i]=='9'){Amount = 9; break;} default: switch(number[i]){ case '.': val = val + 10; pos = i; break; case '0': Amount = (Amount)*10; break; case '1': Amount = (Amount)*10 + 1; break; case '2': Amount = (Amount)*10 + 2; break; case '3': Amount = (Amount)*10 + 3; break; case '4': Amount = (Amount)*10 + 4; break; case '5': Amount = (Amount)*10 + 5; break; case '6': Amount = (Amount)*10 + 6; break; case '7': Amount = (Amount)*10 + 7; break; case '8': Amount = (Amount)*10 + 8; break; case '9': Amount = (Amount)*10 + 9; break; default: val = 0; } } if( (!val) | (val>20) ){val = 0; break;}// val == 0 } if(val==1){*Amt = Amount;} if(val==2){*Amt = 0 - Amount;} if(val==11){ int exp = iters - pos; long den = 1; for( ; exp-- ; ){ den = den*10; } *Amt = Amount/den; } if(val==12){ int exp = iters - pos; long den = 1; for( ; exp-- ; ){ den = den*10; } *Amt = 0 - (Amount/den); } return val; } int main(void) { double AM = 0; int c = CONVERT_3(&AM); printf("\n\n%d %lf\n",c,AM); return(0); } 
0
source

Source: https://habr.com/ru/post/948046/


All Articles