Bedingung anders formulieren



  • @hartmut

    Ich prüfe ja scanf auf den Rückgabewert.

    int a[5];
    
    do
    {
    printf();
    scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    }while(a[0]<1 || a[0]>9 || a[1] usw.);
    

    Hier prüfe ich ob der Wert zwischen 1 und 9 ist. Wenn ich eine größere Zahl eingebe funktioniert es auch. Das Problem ist wenn ich einen Buchstaben eingebe wie m wird das angeblich als 0 erkannt und die Arrays nach dem Buchstaben werden auch mit 0 befüllt.

    Da weiß ich nicht wo das Problem ist. Wieso wird einem Buchstaben eine 0 zugewiesen und die restlichen Arrays auch mit 0 befüllt. Und das nächste Problem ist dass es bei scanf nicht wieder stehen bleibt für eine Eingabe sondern es passiert eine Schleife ohne abbruch.



  • pro schrieb:

    @hartmut

    Ich prüfe ja scanf auf den Rückgabewert.

    Eben nicht:

    int scanf ( const char * format, ... );

    [...]

    On success, the function returns the number of items succesfully read. This count can match the expected number of readings or fewer, even zero, if a matching failure happens.

    http://www.cplusplus.com/reference/clibrary/cstdio/scanf/



  • Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
    Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.

    [cpp]scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    while ((c = getchar()) != '\n');[cpp]



  • Um die Reihen der Moeglichkeiten zu vervollstaendigen bliebe noch der Weg ueber eine verkettete Liste und eine doppelte Rekursion (auch als Stack-Stress-Test):

    typedef struct NumberContainerSingle
    {
            int    iNo;
    
            NumberContainerSingle  *pNext = NULL;
    }
    
    bool IsDoubleSingle (NumberContainerSingle   *pCurrent, 
                         int                      iNo)
    {
            if (pCurrent->iNo == iNo)
                    return true;
    
            if (pCurrent->pNext != NULL)
                    return IsDoubleSingle (pCurrent->pNext, iNo);
            else
                    return false;
    }
    
    bool IsDouble (NumberContainerSingle   *pCurrent)
    {
            if (pCurrent == NULL)
                    return false;
    
            if (pCurrent->pNext != NULL)
            {
                    if (IsDoubleSingle (pCurrent->pNext, pCurrent->iNo) == false)
                            return IsDouble(pCurrent->pNext);
                    else
                            return true;
            }
            else
                    return false;
    }
    

    (Nur der Vollstaendigkeit halber) - Edit: Ist schon spaet ...



  • pro schrieb:

    Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
    Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.

    scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    while ((c = getchar()) != '\n');
    
    typedef struct NumberContainerSingle
    {
            int    iNo;
    
            NumberContainerSingle  *pNext = NULL;
    } 
    
    NumberContainerSingle *ReadNoIn (void)
    {
        char                   cChar    = 'X';
        bool                   fEnd     = false;
        NumberContainerSingle *pReturn  = NULL,
                              *pCurrent = NULL,
                              *pTemp;
    
    do
    {
        do
        {
            cChar = getc ();
            if (cChar == '/n')
                fEnd = true;
        }
        while ((cChar >= '0') && (cChar <= '9') && (fEnd == false))
    
        if (fEnd == false)
        {
            pTemp = malloc (sizeof (NumberContainerSingle));
            if (pTemp == NULL)
            {
                fprintf (stderr, "No Heap\n");
                abort ();
            }
            else if (pReturn == NULL)
                pReturn = pTemp;
            else
                pCurrent->pNext = pTemp;
    
            pCurrent = pTemp;
            pCurrent->iNo = cChar - '0';
        }
    }
    while (fEnd == false);
    
    return pReturn;
    }
    


  • Doppelt



  • pro schrieb:

    Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
    Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.

    [cpp]scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    while ((c = getchar()) != '\n');[cpp]

    feherhafter code.
    %d und nicht &d, &a[n] und nicht a[n] 🙄



  • Danke für die Antworten.

    @hartmut

    Tut mir leid aber ich kann aus deinem Code sehr wenig herauslesen.

    @problemerkenner
    Das waren nur Tippfehler.

    So sieht der Code aus. Ich habe wie schon erwähnt diese Zeile eingefügt

    while ((c = getchar()) != '\n');
    

    . Das Problem ist, seitdem ich diese Zeile hinzugefügt habe muss ich am Ende 2x Enter drücken. Ich glaube das hat etwas mit dem Puffer zu tun.

    Und wie schon erwähnt bei scanf wenn ich jetzt mehr Zahlen eintippe wird der Puffer einfach geleert. Aber wenn ich nur 2 anstatt der 5 Zahlen eintippe und Enter drücke bleibt das Programm hängen. Wahrscheinlich weil es noch auf die restlichen scanf wartet.

    Kann man das irgendwie ausbessern. Wenn ich nur 2 anstatt 5 Zahlen eingebe und Enter drücke soll es im Programm weitermachen.

    .
    .
    .
    .
                do
                {
                    printf ("\n");
    
                    scanf ("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]); 						
    while ((c = getchar()) != '\n');
    
    .
    .
    .
    
            printf ("Spiel wiederholen, \"Enter\" drücken!\n\n");
            getchar();
            scanf ("%c", &enter);
    
        }
        while (enter=='\n');
    


  • Jepp, scanf wartet auf die restlichen Zahlen. Nimm fgets und sscanf.

    Gruß,
    B.B.



  • pro schrieb:

    Danke für die Antworten.

    @hartmut

    Tut mir leid aber ich kann aus deinem Code sehr wenig herauslesen.

    Was ist da unklar? 😕


Anmelden zum Antworten