Bedingung von if statement wird nicht ausgeführt

Kirby.exe

Top Contributor
Ich verstehe nicht ganz warum das Programm nicht ausgibt, dass der Zutritt für das Alter verweigert ist... Hier sind die Eingaben:

Code:
Enter your age here: 17

You need a Person to look after you, what is his name and how old is he?: Ralf Ratte,14

You can enter the Club now! Have fun!

Program ended with exit code: 0

Hier ist der Code:

C:
#include <stdio.h>

int main() {
    int agePerson1, agePerson2;
    char prename[20], surname[20];
    
    printf("Enter your age here: ");
    scanf("%d", &agePerson1);
    
    if(agePerson1 < 18 && agePerson1 >= 16){
        printf("\n You need a Person to look after you, what is his name and how old is he?: ");
        scanf("%s %s,%d", prename, surname, &agePerson2);
        if(agePerson2 < 18){
            printf("\n This Person is not permitted to look after you! \n");
        }else {
            printf("\n You can enter the Club now! Have fun! \n");
        }
    }else if(agePerson1 >= 18){
        printf("\n You can enter the Club now! Have fun! \n");
        printf("We are here");
    }else{
        printf("\n You are to young to even visit a club! \n");
    }
    
    return 0;
}
 

LimDul

Top Contributor
Lass dir mal die Werte ausgeben, sowohl von Vor/Nachname, als auch vom Alter2. Ich kann zwar nicht wirklich c++ aber scanf mag ggf. etwas seltsam sein, was die Entertaste angeht, so dass beim zweiten Scanf seltsame Dinge passieren.
 

Kirby.exe

Top Contributor
Wtf wo kommt diese riesige Zahl her xD:

Code:
Enter your age here: 17
Age Person 1: 17

You need a Person to look after you, what is his name and how old is he?: Ralf Lotter,14

Check: Ralf Lotter,14, 32766

You can enter the Club now! Have fun!
Program ended with exit code: 0
 

Kirby.exe

Top Contributor
Nein auch mit Komma geht er jedes mal ins else...Was mich halt wundert wie die Zahl 32766 Zustande kommt, da ich nur zwei Strings und eine Zahl einlese o_O
C:
scanf("%s %s,%d", prename, surname, &agePerson2);
 
K

kneitzel

Gast
Also zwei wichtige Dinge:
a) Wenn Du eine Funktion aufrufst, dann ignoriere das Ergebnis nicht! (Ok, bei scanf scheinen da alle das machen zu wollen bei den Beispielen!)
==> Rückgabe ist die Anzahl der gelesenen Werte, und das ist bei dir 2. Also der 3te Wert wurde nicht gesetzt.
b) Wenn Du eine Kontrollausgabe machst, dann mach diese so, dass die Aussage klar ist. Einfach alles aneinander hängen ist einfach unklar und in meinen Augen ungeschickt.

scanf liest bei %s zeichen bis zu einem Whitespace. Das ',' ist aber kein Whitespace. Also liest er da halt weiter.

Du kannst das %s nun ersetzen durch ein %[^,] - dann liest er bis er zu einem Komma kommt.
Das scanf würde dann also so aussehen:
int result = scanf("%s %[^,],%d", prename, surname, &agePerson2);

Aber das ist dennoch eine blöde Lösung. Hier wäre mein Ansatz so wie auch in Java und Co: Lies die Eingabe und werte diese dann selbst aus. Und behandel dabei Fehler ordentlich.

Aber der Code sollte funktionieren. Wird nicht ganz so gut Probleme abfangen aber immerhin. Die Eingabe ist aber nur stimmig, wenn result == 3! Den Check also nicht weglassen!
 
K

kneitzel

Gast
Nein auch mit Komma geht er jedes mal ins else...Was mich halt wundert wie die Zahl 32766 Zustande kommt, da ich nur zwei Strings und eine Zahl einlese o_O
C:
scanf("%s %s,%d", prename, surname, &agePerson2);
Er schreibt da keinen Wert rein. Das sollte also der Wert sein, der vorher enthalten war. Setz agePerson2 doch vorher mal auf -178 oder so - dann sollte der Wert -178 sein :)
 

Kirby.exe

Top Contributor
Also zwei wichtige Dinge:
a) Wenn Du eine Funktion aufrufst, dann ignoriere das Ergebnis nicht! (Ok, bei scanf scheinen da alle das machen zu wollen bei den Beispielen!)
==> Rückgabe ist die Anzahl der gelesenen Werte, und das ist bei dir 2. Also der 3te Wert wurde nicht gesetzt.
b) Wenn Du eine Kontrollausgabe machst, dann mach diese so, dass die Aussage klar ist. Einfach alles aneinander hängen ist einfach unklar und in meinen Augen ungeschickt.

scanf liest bei %s zeichen bis zu einem Whitespace. Das ',' ist aber kein Whitespace. Also liest er da halt weiter.

Du kannst das %s nun ersetzen durch ein %[^,] - dann liest er bis er zu einem Komma kommt.
Das scanf würde dann also so aussehen:
int result = scanf("%s %[^,],%d", prename, surname, &agePerson2);

Aber das ist dennoch eine blöde Lösung. Hier wäre mein Ansatz so wie auch in Java und Co: Lies die Eingabe und werte diese dann selbst aus. Und behandel dabei Fehler ordentlich.

Aber der Code sollte funktionieren. Wird nicht ganz so gut Probleme abfangen aber immerhin. Die Eingabe ist aber nur stimmig, wenn result == 3! Den Check also nicht weglassen!
Ahh ok :) Ich lese gerade ein Buch zu C und das war bis jetzt die einzige Methode zum einlesen von User Information die bis jetzt behandelt wurde :) Ich hatte jedoch im Internet gelesen, dass es eine wesentlich bessere Methode gibt xD Aber ich mache mal lieber erstmal kleine Schritte :) Danke für den Tipp.
 

M.L.

Top Contributor
Kleine Änderung am Code, damit das Ergebnis zumindest vom Kern (Altersüberprüfung) her stimmt. Auch wenn der verwendete MS-VC++-Compiler andere Befindlichkeiten (scanf -> "scanf_s") hat und das Programm verbesserungswürdig sein dürfte:
C:
...//Anfang wie gehabt
int agePerson1, agePerson2 = 0;
    //char prename[20], surname[20];
    char temp;

    printf("Enter your age here: ");
    scanf_s("%d%c", &agePerson1, &temp);

    if (agePerson1 < 18 && agePerson1 >= 16) {
        printf("\n You need a Person to look after you, how old is (s)he?: ");
        scanf_s("%d%c", &agePerson2, &temp);
        printf("%d\n", agePerson2);
        if (agePerson2 < 18) {
            ...// Rest wie gehabt
 
K

kneitzel

Gast
Also den MS-VC++ Compiler habe ich hier nicht, aber folgendes läuft relativ gut bei mir (ich habe es in einer cygwin Umgebung getestet):

Programm:
C:
#include <stdio.h>
int main()
{
    int agePerson1, agePerson2;
    char prename[20], surname[20];
    int result;
    printf("\n You need a Person to look after you, what is his name and how old is he?: ");
    result = scanf("%s %[^,],%d", prename, surname, &agePerson2);

    printf("result: %d\n", result);
    printf("prename: %s\n", prename);
    printf("surname; %s\n", surname);
    printf("age: %d", agePerson2);
}
Ausgabe:
Code:
konrad@ZBook15G2 ~
$ ./test

You need a Person to look after you, what is his name and how old is he?: Anton Tester, 12
result: 3
prename: Anton
surname; Tester
age: 12
konrad@ZBook15G2 ~

Edit: Aus dem Code noch die Zeile heraus genommen, die agePerson2 einen Wert gab.
 

Neue Themen


Oben