hoe controleer je of de invoer een getal is of niet in C?

In de hoofdfunctie van C:

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

In de opdrachtregel zullen we een willekeurig getal typen, bijvoorbeeld 1of 2als invoer, maar het wordt behandeld als char-array voor de parameter van argv, maar hoe zorg je ervoor dat de invoer een getal is, voor het geval mensen helloof chebben getypt?


Antwoord 1, autoriteit 100%

Een andere manier om dit te doen is door de isdigit-functie te gebruiken. Hieronder staat de code ervoor:

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

Antwoord 2, autoriteit 68%

Je kunt een functie gebruiken zoals strtol()die een tekenreeks naar een long converteert.

Het heeft een parameter die een manier is om het eerste teken te detecteren dat niet correct werd geconverteerd. Als dit iets anders is dan het einde van de string, dan heb je een probleem.

Zie het volgende programma voor een voorbeeld:

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

Als u dit uitvoert, kunt u het in werking zien:

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

Antwoord 3, autoriteit 32%

Het gebruik van scanfis heel eenvoudig, dit is een voorbeeld:

if (scanf("%d", &val_a_tester) == 1) {
    ... // it's an integer
}

Antwoord 4, autoriteit 23%

Een zelfgemaakte oplossing:

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

Merk op dat deze oplossing niet in productiecode moet worden gebruikt, omdat deze ernstige beperkingen heeft. Maar ik vind het leuk om C-Strings en ASCIIte begrijpen.


Antwoord 5, autoriteit 9%

Vrij eenvoudige code gebruiken:

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 */
    }
}

Antwoord 6

Ik worstelde hier al een tijdje mee, dus ik dacht laat ik er even mijn twee cent bij optellen:

1) Maak een aparte functie om te controleren of een fgets-invoer volledig uit cijfers bestaat:

int integerCheck(){
char myInput[4];
fgets(myInput, sizeof(myInput), stdin);
    int counter = 0;
    int i;
    for (i=0; myInput[i]!= '\0'; i++){
        if (isalpha(myInput[i]) != 0){
            counter++;
            if(counter > 0){
                printf("Input error: Please try again. \n ");
                return main();
            }
        }
    }
    return atoi(myInput); 
}

Het bovenstaande start een lus door elke eenheid van een fgets-invoer tot de eindwaarde NULL. Als het een letter of een operator tegenkomt, voegt het “1” toe aan de int “teller” die aanvankelijk op 0 is ingesteld. Zodra de teller groter wordt dan 0, geeft het geneste if-statement de lus de opdracht om een foutmelding af te drukken & start het programma vervolgens opnieuw. Als de lus is voltooid en int ‘counter’ nog steeds de waarde 0 is, wordt het oorspronkelijk ingevoerde gehele getal geretourneerd dat in de hoofdfunctie moet worden gebruikt …

2) de belangrijkste functie zou zijn:

int main(void){
unsigned int numberOne;
unsigned int numberTwo;
numberOne = integerCheck();
numberTwo = integerCheck();
return numberOne*numberTwo;
}

Ervan uitgaande dat beide gehele getallen correct zijn ingevoerd, zal het gegeven voorbeeld het resultaat opleveren van int “numberOne” vermenigvuldigd met int “numberTwo”. Het programma wordt herhaald zolang het duurt om twee correct ingevoerde gehele getallen te krijgen.


Antwoord 7

if (sscanf(command_level[2], "%f%c", &check_f, &check_c)!=1)
{
        is_num=false;
}
else
{
        is_num=true;
}   
if(sscanf(command_level[2],"%f",&check_f) != 1) 
{
    is_num=false;
}

Hoe zit het?


Antwoord 8

Dit werkt voor mij

#include <string.h>
int isNumber(char *n) {
  int i = strlen(n);
  int isnum = (i>0);
  while (i-- && isnum) {
    if (!(n[i] >= '0' && n[i] <= '9')) {
      isnum = 0;
    }
  }
  return isnum;
}

b.v.:

printf("%i\n", isNumber("12"));   // 1
printf("%i\n", isNumber("033"));  // 1
printf("%i\n", isNumber("0"));    // 1
printf("%i\n", isNumber(""));     // 0
printf("%i\n", isNumber("aaa"));  // 0
printf("%i\n", isNumber("\n"));   // 0
printf("%i\n", isNumber("a0\n")); // 0

Antwoord 9

De SSCANF () -oplossing is beter in termen van codelijnen. Mijn antwoord hier is een gebruikersbouwfunctie die bijna hetzelfde doet als Sscanf (). Slaat het geconverteerde nummer op in een aanwijzer en retourneert een waarde die “VAL” wordt genoemd. Als val uitkomt als nul, is de invoer in niet-ondersteund formaat, dus is conversie mislukt. Gebruik daarom alleen de aanwijzerwaarde wanneer val niet-nul is.

Het werkt alleen als de invoer in basis-10-formulier is.

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

Other episodes