Überprüfen Sie, ob der Eingang ein Integer-Typ in C ist

Der Haken ist, dass ich atoi oder eine andere function wie diese nicht benutzen kann (ich bin mir ziemlich sicher, dass wir uns auf mathematische Operationen verlassen sollten).

int num; scanf("%d",&num); if(/* num is not integer */) { printf("enter integer"); return; } 

Ich habe es versucht:

 (num*2)/2 == num num%1==0 if(scanf("%d",&num)!=1) 

aber nichts davon funktionierte.

Irgendwelche Ideen?

   

num wird immer eine ganze Zahl enthalten, weil es ein int . Das eigentliche Problem mit Ihrem Code ist, dass Sie den scanf Rückgabewert nicht überprüfen. scanf gibt die Anzahl der erfolgreich gelesenen Elemente zurück. In diesem Fall muss 1 für gültige Werte zurückgegeben werden. Wenn nicht, wurde ein ungültiger Integer-Wert eingegeben und die num Variable wurde wahrscheinlich nicht geändert (dh hat immer noch einen willkürlichen Wert, weil Sie ihn nicht initialisiert haben).

Sie möchten dem Benutzer nur erlauben, eine Ganzzahl gefolgt von der Eingabetaste einzugeben. Leider kann dies nicht einfach durch scanf("%d\n") , aber hier ist ein Trick:

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

Sie müssen Ihre Eingabe zuerst als Zeichenfolge lesen und dann die Zeichenfolge analysieren, um festzustellen, ob sie gültige numerische Zeichen enthält. Wenn dies der Fall ist, können Sie es in eine Ganzzahl konvertieren.

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

Es gibt mehrere Probleme bei der Verwendung von scanf mit dem %d Konvertierungsbezeichner:

  1. Wenn die Eingabezeichenfolge mit einer gültigen Ganzzahl beginnt (z. B. “12abc”), wird die “12” aus dem Eingabestream gelesen und konvertiert und num zugewiesen, und scanf gibt 1 zurück, sodass Sie bei Erfolg den Erfolg anzeigen (wahrscheinlich) sollte nicht;

  2. Wenn die Eingabezeichenfolge nicht mit einer Ziffer scanf , liest scanf keine Zeichen aus dem Eingabestream, num wird nicht geändert und der Rückgabewert ist 0;

  3. Sie geben nicht an, ob Sie nicht-dezimale Formate verarbeiten müssen, aber dies funktioniert nicht, wenn Sie ganzzahlige Werte in oktalen oder hexadezimalen Formaten (0x1a) verarbeiten müssen. Der %i Konvertierungsbezeichner verarbeitet Dezimal-, Oktal- und Hexadezimalformate, aber Sie haben immer noch die ersten beiden Probleme.

Zuallererst müssen Sie die Eingabe als Zeichenfolge lesen (vorzugsweise mit fgets ). Wenn Sie atoi nicht verwenden dürfen, atoi Sie wahrscheinlich auch strtol nicht verwenden. Sie müssen also jedes Zeichen in der Zeichenfolge untersuchen. Der sichere Weg, um nach Zahlenwerten zu isdigit besteht darin, die isdigit Bibliotheksfunktion zu verwenden (es gibt auch die isodigit und isxdigit functionen zum Prüfen von oktalen und hexadezimalen Ziffern), wie z

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

(Wenn Sie nicht einmal isdigit , isodigit oder isxdigit , dann schlagen Sie Ihren Lehrer / Professor, um die Aufgabe härter zu machen, als es wirklich sein muss).

Wenn Sie mit Oktal- oder Hex-Formaten umgehen können, wird es etwas komplizierter. Die C-Konvention ist für oktale Formate, die eine führende 0 Stelle und für Hex-Formate eine führende 0 Stelle haben. Wenn also das erste Nicht-Whitespace-Zeichen eine 0 ist, müssen Sie das nächste Zeichen prüfen, bevor Sie wissen, welches nicht-dezimale Format verwendet werden soll.

Die grundlegende Gliederung ist

  1. Wenn das erste Nicht-Leerzeichen keine ‘-‘, ‘+’, ‘0’ oder Nicht-Null-Dezimalziffer ist, dann ist dies keine gültige ganze Zahl;
  2. Wenn das erste Nicht-Leerzeichen Zeichen ‘-‘ ist, dann ist dies ein negativer Wert, andernfalls nehmen wir einen positiven Wert an;
  3. Wenn das erste Zeichen “+” ist, ist dies ein positiver Wert;
  4. Wenn das erste Nicht-Whitespace- und Nicht-Zeichen-Zeichen eine von Null verschiedene Dezimalziffer ist, dann ist die Eingabe im Dezimalformat und Sie werden isdigit , um die verbleibenden Zeichen zu überprüfen;
  5. Wenn das erste Nicht-Whitespace- und Nicht-Zeichen-Zeichen eine “0” ist, dann ist die Eingabe entweder oktal oder hexadezimal;
  6. Wenn das erste Nicht-Whitespace- und Nicht-Zeichen-Zeichen eine ‘0’ und das nächste Zeichen eine Ziffer von ‘0’ bis ‘7’ ist, dann ist die Eingabe im isodigit und Sie werden isodigit , um die verbleibenden Zeichen zu überprüfen ;
  7. Wenn das erste Nicht-Leerzeichen und Nicht-Zeichen-Zeichen eine 0 war und das zweite Zeichen x oder X , dann ist die Eingabe im Hexadezimal-Format und Sie werden isxdigit , um die verbleibenden Zeichen zu überprüfen;
  8. Wenn eines der verbleibenden Zeichen die oben angegebene Prüffunktion nicht erfüllt, ist dies keine gültige Ganzzahl-Zeichenkette.

Fragen Sie sich zuerst, wie Sie erwarten würden , dass dieser Code KEINE Ganzzahl zurückgibt:

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

Sie haben die Variable als Typ integer angegeben, dann scanf , aber nur für eine ganze Zahl ( %d ).

Was könnte es sonst noch an dieser Stelle enthalten?

Ich habe oben die Eingaben aller gesehen, was sehr nützlich war, und eine function erstellt, die für meine eigene Anwendung geeignet war. Die function bewertet wirklich nur, dass die Eingabe des Benutzers keine “0” ist, aber es war gut genug für meinen Zweck. Hoffe das hilft!

 #include 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) && (iUserInputiUpperBound)){ printf("Please make a valid selection (%i-%i).\n", iLowerBound, iUpperBound); iUserInput=0; } } return iUserInput; } 

Versuche dies…

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

Das ist benutzerfreundlicher, denke ich:

 #include /* 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; } 

Ich entwickelte diese Logik mit Hilfe von scanf stress:

 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 () gibt die Anzahl der übereinstimmenden Formatbezeichner zurück und gibt daher null zurück, wenn der eingegebene Text nicht als Dezimalzahl interpretiert werden kann

Ich hatte das gleiche Problem, endlich herausgefunden, was zu tun ist:

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

Ich habe nach einer einfacheren Lösung gesucht, die nur Schleifen und if-statementen verwendet, und das ist, was ich gefunden habe. Das Programm arbeitet auch mit negativen Ganzzahlen und weist alle gemischten Eingaben, die sowohl Ganzzahlen als auch andere Zeichen enthalten können, korrekt zurück.


 #include  #include  // Used for atoi() function #include  // 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; } 

Diese Methode funktioniert für alles (ganze Zahlen und sogar verdoppelt) außer Null (es nennt es ungültig):

Die while-Schleife dient nur der wiederholten Benutzereingabe. Im Grunde prüft es, ob die ganze Zahl x / x = 1 ist. Wenn es (wie bei einer Zahl), ist es eine ganze Zahl / double. Wenn nicht, ist es offensichtlich nicht. Zero versagt den Test jedoch.

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

Ich habe einen Weg gefunden, um zu überprüfen, ob die angegebene Eingabe eine ganze Zahl ist oder nicht, mit der function atoi ().

Lesen Sie die Eingabe als Zeichenfolge und verwenden Sie die function atoi (), um die Zeichenfolge in eine Ganzzahl zu konvertieren.

atoi () – function gibt die Integer-Zahl zurück, wenn die Eingabezeichenfolge Integer enthält, andernfalls gibt sie 0 zurück. Sie können den Rückgabewert der atoi () -function überprüfen, um festzustellen, ob die angegebene Eingabe eine Ganzzahl ist oder nicht.

Es gibt viel mehr functionen, um eine Zeichenfolge in lange, doppelte etc. zu konvertieren. Überprüfen Sie die Standardbibliothek “stdlib.h” für mehr.

Hinweis: Es funktioniert nur für Zahlen ungleich Null.

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