Überprüfen Sie, ob die Eingabe in C vom Typ Integer ist

Lesezeit: 8 Minuten

Benutzeravatar von Gal
Gal

Der Haken ist, dass ich atoi oder andere ähnliche Funktionen nicht verwenden 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?

  • Was meinst du mit “nichts davon hat funktioniert”? Und wie hast du das letzte versucht?

    – David Thornley

    1. November 2010 um 19:52 Uhr

  • @David Ich habe sie in die if-Anweisung eingefügt, was ist daran verwirrend?

    – Gal

    1. November 2010 um 19:54 Uhr

  • Welche Art von Eingabe ist “Integer-Typ”? Eines, das nur aus Ziffern besteht? Ist ein Minuszeichen vorne erlaubt?

    – gleich

    1. November 2010 um 20:05 Uhr

  • Sie listen zwei Bedingungen und eine if-Anweisung auf. Ich nehme an, Sie haben keine if-Anweisung in eine if-Anweisung eingefügt, daher weiß ich nicht, was Sie dort getan haben. (Haben Sie nur die if-Anweisung ersetzt oder war sie wichtiger als das?) Sie geben auch keinen Hinweis auf den Fehlermodus außer “keines davon hat funktioniert”. Nicht kompiliert? Laufzeit Fehler? Hat nicht so funktioniert, wie Sie es erwartet haben (und wenn ja, was haben Sie erwartet?)?

    – David Thornley

    1. November 2010 um 21:10 Uhr

  • Ich weiß, dass ich zu spät zur Party komme, aber ich nehme an, Sie “können nicht” (was bedeutet: dürfen nicht) verwenden atoi() weil die Idee ist, dass Sie die Überprüfung “manuell” durchführen, indem Sie durch die Zeichen gehen und prüfen, ob sie im Bereich 0-9 liegen. Es ist daher wahrscheinlich scanf() sollte auch nicht verwendet werden.

    – Peter – Setzen Sie Monica wieder ein

    7. Januar 2019 um 12:44 Uhr

Benutzeravatar von AndiDog
AndiDog

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

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

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

  • Nein, ich habe den Rückgabewert überprüft und er war “1”, auch für Nicht-Ganzzahlen wie “2k”.

    – Gal

    1. November 2010 um 19:51 Uhr

  • @sombe: Wann scanf liest eine Zahl und erkennt ein nicht-stelliges Zeichen, stoppt es einfach dort und überlässt es dem Stream (und in diesem Fall “gibt” einfach 2 zurück)

    – gleich

    1. November 2010 um 19:55 Uhr

  • @eq das spielt keine Rolle, wenn der Benutzer einen nicht ganzzahligen Schlüssel einfügt, muss ich ihn erkennen und einen Fehler ausgeben.

    – Gal

    1. November 2010 um 19:58 Uhr

  • @sombe: Bearbeitet, um Ihren Anwendungsfall zuzulassen.

    – AndiDog

    1. November 2010 um 20:04 Uhr

  • Ich habe es versucht und es hat funktioniert, ich hoffe wirklich, es ist in Ordnung. Ich danke dir sehr.

    – Gal

    1. November 2010 um 20:15 Uhr

Benutzeravatar von Paul R
Paul R

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 ganze Zahl umwandeln.

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

  • Gibt es eine Möglichkeit, dies mit Regex zu erreichen?

    – Gal

    1. November 2010 um 19:09 Uhr

  • @sombe: Sicher, die Validierung einer Ganzzahl mit Regex ist gerecht \d+. Aber hat C reguläre Ausdrücke?

    Benutzer395760

    1. November 2010 um 19:10 Uhr

  • Bitte schlagen Sie nicht die Verwendung des Gefährlichen vor gets().

    – Greg Hewgill

    1. November 2010 um 19:11 Uhr

  • @sombe Sie müssen das tun, aber nachdem Sie überprüft haben, dass es gültig ist, müssen Sie a hinzufügen sscanf(s, "%d", num); was daraus eine Ganzzahl machen wird.

    – Benutzer470379

    1. November 2010 um 19:19 Uhr


  • @sombe, kannst du uns die tatsächlichen Anforderungen nennen? Ich vermute, Sie sollten auch die String-> Dezimal-Konvertierung durchführen (so würde ich die Zuweisung schreiben)

    – Der Ur-Paul

    1. November 2010 um 19:33 Uhr

Es gibt mehrere Probleme bei der Verwendung scanf mit dem %d Konvertierungsbezeichner, um dies zu tun:

  1. Wenn die Eingabezeichenfolge mit einer gültigen Ganzzahl (z. B. “12abc”) beginnt, wird die “12” aus dem Eingabestrom gelesen und konvertiert und zugewiesen numund scanf wird 1 zurückgeben, also geben Sie Erfolg an, wenn Sie es (wahrscheinlich) nicht sollten;

  2. Wenn die Eingabezeichenfolge nicht Beginnen Sie dann mit einer Ziffer scanf werde nicht lesen irgendein Zeichen aus dem Eingabestrom, 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. Das %i Der Konvertierungsbezeichner verarbeitet Dezimal-, Oktal- und Hexadezimalformate, aber Sie haben immer noch die ersten beiden Probleme.

Zunächst müssen Sie die Eingabe als Zeichenfolge lesen (vorzugsweise mit fgets). Wenn Sie nicht verwenden dürfen atoidürfen Sie wahrscheinlich nicht verwenden strtol entweder. Sie müssen also jedes Zeichen in der Zeichenfolge untersuchen. Der sichere Weg, um nach Ziffernwerten zu suchen, ist die Verwendung von isdigit Bibliotheksfunktion (es gibt auch die isodigit und isxdigit Funktionen zum Prüfen von Oktal- bzw. Hexadezimalziffern), wie z

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

(wenn Sie nicht einmal verwenden dürfen isdigit, isodigitoder isxdigitdann schlagen Sie Ihren Lehrer/Professor dafür, dass er die Aufgabe schwieriger gemacht hat, als es wirklich sein muss).

Wenn Sie mit oktalen oder hexadezimalen Formaten umgehen können müssen, wird es etwas komplizierter. Die C-Konvention sieht vor, dass Oktalformate einen führenden Wert haben 0 Ziffer und für Hex-Formate einen führenden Wert haben 0x. Wenn also das erste Nicht-Leerzeichen eine 0 ist, müssen Sie das nächste Zeichen überprüfen, bevor Sie wissen, welches Nicht-Dezimalformat zu verwenden ist.

Die grundlegende Gliederung ist

  1. Wenn das erste Nicht-Leerzeichen kein ‘-‘, ‘+’, ‘0’ oder eine Dezimalziffer ungleich Null ist, dann ist dies keine gültige Ganzzahlzeichenfolge;
  2. Wenn das erste Nicht-Leerzeichen ‘-‘ ist, dann ist dies ein negativer Wert, andernfalls nehmen wir einen positiven Wert an;
  3. Wenn das erste Zeichen ein ‘+’ ist, dann ist dies ein positiver Wert;
  4. Wenn das erste Nicht-Leerraum- und Nicht-Vorzeichenzeichen eine Dezimalziffer ungleich Null ist, dann ist die Eingabe im Dezimalformat und Sie verwenden isdigit um die verbleibenden Zeichen zu überprüfen;
  5. Wenn das erste Nicht-Leerraum- und Nicht-Vorzeichen-Zeichen eine ‘0’ ist, dann ist die Eingabe entweder im Oktal- oder im Hexadezimalformat;
  6. Wenn das erste Nicht-Leerraum- und Nicht-Vorzeichen-Zeichen eine ‘0’ war und das nächste Zeichen eine Ziffer von ‘0’ bis ‘7’ ist, dann ist die Eingabe im Oktalformat und Sie werden verwenden isodigit um die verbleibenden Zeichen zu überprüfen;
  7. Wenn das erste Nicht-Leerraum- und Nicht-Vorzeichen-Zeichen eine 0 war und das zweite Zeichen eine ist x oder Xdann ist die Eingabe im Hexadezimalformat und Sie werden verwenden 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 Ganzzahlzeichenfolge.

Fragen Sie sich zuerst, wie Sie es tun würden je Erwarten Sie diesen Code NICHT gibt eine ganze Zahl zurück:

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

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

Was könnte es an dieser Stelle möglicherweise noch enthalten?

Wenn jemand anderes diese Frage stellt, ich habe ein Programm geschrieben, das ständig zur Eingabe einer Zahl auffordert, wenn die Eingabe des Benutzers keine Ganzzahl ist, und endet, wenn eine Ganzzahl akzeptiert wird

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

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

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

Benutzeravatar von Unihedron
Einfarbig

Versuche dies…

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

  • Bei ungültiger Zahleneingabe für scanf("%f",&a); und a nicht initialisiert, q=(int)a; ist nicht definiert. Code sollte den Rückgabewert von überprüfen scanf("%f",&a) vor Gebrauch a.

    – chux – Wiedereinsetzung von Monica

    7. Januar 2017 um 23:40 Uhr


1402460cookie-checkÜberprüfen Sie, ob die Eingabe in C vom Typ Integer ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy