webentwicklung-frage-antwort-db.com.de

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

Der Haken ist, dass ich keine Atoi oder andere Funktionen 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?

24
Gal

num enthält immer eine ganze Zahl, da es sich um eine int handelt. Das real Problem mit Ihrem Code besteht darin, dass Sie den Rückgabewert scanf 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 ganzzahliger Wert eingegeben und die Variable num wurde wahrscheinlich nicht geändert (d. H. Hat immer noch einen beliebigen Wert, da Sie ihn nicht initialisiert haben).

Nach Ihrem Kommentar möchten Sie dem Benutzer lediglich die Eingabe einer Ganzzahl gefolgt von der Eingabetaste ermöglichen. Leider kann dies nicht einfach durch scanf("%d\n") erreicht werden, 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");
33
AndiDog

Sie müssen Ihre Eingabe zuerst als Zeichenfolge lesen und dann die Zeichenfolge analysieren, um zu sehen, 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;
        }
    }
}
22
Paul R

Bei der Verwendung von scanf mit dem %d-Konvertierungsspezifizierer treten dazu mehrere Probleme auf:

  1. Wenn die Eingabezeichenfolge mit einer gültigen Ganzzahl beginnt (z. B. "12abc"), wird die "12" aus dem Eingabestrom gelesen und konvertiert und num zugewiesen. scanf gibt 1 zurück. Wenn Sie also erfolgreich sind (wahrscheinlich) sollte nicht;

  2. Wenn der Eingabestring nicht mit einer Ziffer beginnt, liest scanf keine - 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. Dies funktioniert jedoch nicht, wenn Sie Ganzzahlwerte in Oktal- oder Hexadezimalformaten (0x1a) behandeln müssen. Der %i-Konvertierungsspezifizierer behandelt Dezimal-, Oktal- und Hexadezimal-Formate. Die ersten beiden Probleme sind jedoch noch vorhanden. 

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

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

(Wenn Sie nicht einmal isdigit, isodigit oder isxdigit verwenden dürfen, schlagen Sie Ihrem Lehrer/Professor, um die Aufgabe schwieriger zu gestalten, als es wirklich sein muss). 

Wenn Sie mit Oktal- oder Hex-Formaten umgehen können, wird es etwas komplizierter. Die C-Konvention sieht vor, dass Oktalformate eine führende 0-Ziffer und Hex-Formate einen führenden 0x haben. Wenn das erste Nicht-Whitespace-Zeichen eine 0 ist, müssen Sie das nächste Zeichen prüfen, bevor Sie wissen können, welches nicht dezimale Format verwendet werden soll. 

Die grundlegende Gliederung lautet 

  1. Wenn das erste Nicht-Whitespace-Zeichen keine Dezimalzahl '-', '+', '0' oder eine Dezimalzahl ist, die keine Null ist, ist dies keine gültige Ganzzahlzeichenfolge.
  2. Wenn das erste Nicht-Whitespace-Zeichen '-' ist, 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-Vorzeichen eine Dezimalzahl ist, die nicht Null ist, dann ist die Eingabe im Dezimalformat, und Sie werden die verbleibenden Zeichen mit isdigit prüfen.
  5. Wenn das erste Nicht-Leerzeichen- und Nicht-Vorzeichen eine '0' ist, ist die Eingabe entweder im Oktal- oder Hexadezimalformat.
  6. Wenn das erste Nicht-Whitespace- und Nicht-Zeichen-Zeichen eine '0' war und das nächste Zeichen eine Ziffer von '0' bis '7' ist, erfolgt die Eingabe im Oktalformat, und Sie werden die verbleibenden Zeichen mit isodigit prüfen ;
  7. Wenn das erste Nicht-Whitespace- und Nicht-Zeichen-Zeichen eine 0 war und das zweite Zeichen x oder X ist, ist die Eingabe im Hexadezimalformat und Sie 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. 
13
John Bode

Fragen Sie sich zuerst, wie Sie ever erwarten würden, dass dieser Code NICHT eine ganze Zahl zurückgibt:

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

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

Was könnte es an dieser Stelle noch enthalten?

4
abelenky

Ich habe mir alle Beiträge von oben angesehen, was sehr nützlich war, und eine Funktion erstellt, die für meine eigene Anwendung geeignet ist. Die Funktion bewertet wirklich nur, dass die Eingabe des Benutzers keine "0" ist, aber für meinen Zweck gut genug war. 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;
}
0
Nick

Ich denke, dies ist benutzerfreundlicher:

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

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;
}
0
OscaRoCa
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. Wenn also der eingegebene Text nicht als Dezimalzahl interpretiert werden kann, wird Null zurückgegeben

0
Eduardo

Ich habe diese Logik mithilfe von get und weg von Scanf Streit entwickelt: 

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);
    }
}
0
Shaimaa Yehia