[Novize] Simple If Funktion klappt nicht - finde den Fehler nicht



  • Hallo Leute!

    Bin neu in C aber total begeistert davon und liebe es meine Fehler zu beheben. Leider habe ich nach ner Stunde googlen den Fehler immer noch nicht ausfindig machen können 😞

    #include <stdio.h>
    #include <string.h>
    
    int main()
    
    {
    	char Buchstabe;
    
    	printf("Geben sie einen Buchstaben ein: ");
    	scanf("%c",Buchstabe);
    
    	if(Buchstabe == "a")
    		printf("Der Buchstabe %c ist ein Vokal",Buchstabe);
    	else
    		printf("Der Buchstabe %c ist ein Konsonant",Buchstabe);
    
    	return 0;	
    }
    

    Fehlermeldung:

    C:\Users\Charlie\Desktop\C Programming>gcc Melanie.c -o Test.exe
    Melanie.c: In Funktion »main«:
    Melanie.c:13:15: Warnung: Vergleich zwischen Zeiger und Ganzzahl [standardmäßig
    aktiviert]
    

    Wer findet den Bug?
    Ist es überhaupt ein Fehler? Oder nur eine Warnung?
    Ausführbar ist das Ganze trotzdem. Leider Crash nach User Input 😕

    gruß Charlie



  • scanf braucht die Adresse der Variable!



  • Und Du kannst Die Variable Buchstabe nicht mit einer String-Konstante vergleichen! Wenn dann so ..

    [code="cpp"]

    if(buchstabe == 'a') {

    ...

    }



  • _lowbyte schrieb:

    scanf braucht die Adresse der Variable!

    scanf("%c",Buchstabe);
    

    Buchstabe ist doch die Adresse der Variable ? Oder ist dies nur der Variablen Namen und ich muss via Pointer auf die Adresse hinweisen?

    Funktioniert scanf dann wie ein Pointer der die Variable ändert auf die er <zeigt> ?

    Wie muss ich das Ganze dann umschreiben damit es passt?

    einen Pointer erstellen der auf die Adresse von Buchstabe <zeigt> und diesen dann anstelle von "Buchstabe" in der Funktion angeben?



  • Du musst nicht extra eine Zeiger-Variable erstellen. Es reicht, wenn du den Adressoperator verwendest:

    scanf("%c",&Buchstabe);
    

    Du solltest dir solche Dinge wirklich anlesen, anstatt nur 'rumzuprobieren. Damit kommst du auf Dauer nicht weiter. 🙂



  • Eigentlich hab ich das gelernt mit dem Adressoperator, leider jetzt nicht abrufen können. Naja dafür ist das üben ja gedacht 😉

    Inwiefern kann ich Die Eingabe von Buchstabe denn jetzt richtih vergleichen? Ich würde vielleicht die ANCII Werte für ein Vokal mit der von scanf empfangenen char vergleichen? würde das hinhauen?



  • Hat lowbyte doch schon geschrieben:

    if(buchstabe == 'a') { 
    
    ... 
    
    }
    

    ' statt ", dann vergleichst du mit char, nicht char*.

    EDIT: Und direkt mit dem ASCII-Wert zu vergleichen, ist keine gute Idee. Es ist zwar im Grunde das gleiche, ob du mit 'a' oder mit 97 vergleichst, aber 'a' ist deutlich lesbarer.



  • Falke88 schrieb:

    Funktioniert scanf dann wie ein Pointer der die Variable ändert auf die er <zeigt> ?

    Wenn du einer Funktion die Adresse einer Variablen übergibst, dann kann die Funktion den Wert (Inhalt) der Variablen ändern.
    Da ist scanf nichts besonderes.

    Falke88 schrieb:

    Buchstabe ist doch die Adresse der Variable ? Oder ist dies nur der Variablen Namen und ich muss via Pointer auf die Adresse hinweisen?

    Wenn du den Variablennamen nimmst bekommst du den Wert der Variable geliefert.

    Bei einem Array allerdings bekommst du einen Wert, wenn du noch den Index (in []) eines Elementes mit angibst.
    Steht der Name eines Arrays alleine, bekommst du die Anfangsadresse des Arrays.

    Zeichenketten werden in C als char-Arrays behandelt.
    Daher ist ein 'a' etwas anderes als ein "a"
    'a' ist ein Ganzzahlwert (ein char).
    "a" ergibt die Adresse, wo die Zeichenkette im Speicher steht (ein char *).



  • Danke Leute! Top Erklärungen.
    Nun sollte mein Hirn dies abspeichern 😉

    gruß Charlie



  • Und noch was: if ist keine Funktion. 😉



  • _matze schrieb:

    Und noch was: if ist keine Funktion. 😉

    Control Structure nennt man es eher oder? Bzw eine method?



  • Kontrollstruktur ist richtig, ja. Methode nicht. if-Abfrage, if-Verzweigung von mir aus. Aber halt nicht if-Funktion und auch nicht if-Schleife. 😉


Anmelden zum Antworten