char Eingabe in if Anweinsung verarbeiten



  • Hallo

    ich möchte eine Eingabe in char einlesen und in einer if anweisung verarbeiten:

    int main()
    {
    char a = "0";
    cin >> a;
    if (a == "m") cout << .........
    if (a == "w" cout << ..........
    }

    Ich bekomme dann folgende Fehlermeldungen:

    ///projects/Test101/main.cpp:11:11: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
    ///projects/Test101/main.cpp:13:11: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
    ///projects/Test101/main.cpp:13:24: error: expected primary-expression before ‘...’ token
    ///projects/Test101/main.cpp:13:24: error: expected ‘;’ before ‘...’ token

    wenn ich dann char in char* umwandel :

    int main()
    {
    char* a = "0";
    cin >> a;
    if (a == "m") cout << .........
    if (a == "w" cout << ..........
    }

    Bekomme ich keine Fehlermeldung mehr ABER die Variable a hat keinen Wert. Noch nicht einmal 0 ??

    Jemand eine Idee ??
    Danke


  • Mod

    "m" ist ein Zeichenkettenliteral (Technisch ein const char[2]). 'm' ist ein Zeichenliteral.



  • Super Danke !!

    Mit 'm' funktioniert das ganze.



  • char a = "5";
    

    Falsch, denn "5" gibt einen Zeiger auf eine Speicherstelle mit AFAIK folgendem Anfang:

    0x6546dd6 0x34 //Irgendeine Speicherstelle mit ASCII Wert
    0x6546dd7 0x0  //Terminierungszeichen
    

    a ist(bzw. wäre als Zeiger) dann 0x6546dd6.

    Das Zeichenkettenliteral ist eine Abkürzung für eine Kette von Zeichenliteralen und einem
    Terminierungszeichen '\0' (das den Wert 0 hat und beim Lesen mitteilt, wo das Ende einer Zeichenkette liegt (so arbeitet auch strlen())) am Ende:

    "Hallo Welt"
    

    ist

    'H' 
    'a' 
    'l'
    'l'
    'o'
    ' '
    'W'
    'e'
    'l'
    't'
    '\0'
    

    ein Character (char) ist nur ein Integraler typ der Größe eines Bytes (siehe sizeof(char()), bzw. sizeof(char)), ein Zeiger auf einen char ist aber etwas anderes. Zeiger haben eine
    eigene Größe (bei mir z.B. 4 Bytes (siehe z.b. sizeof(char*()) bzw. sizeof(char*)).

    Sieh dir auch nochmal das an:

    #include <iostream>
    
    int main()
    {
        std::cout << "asdf" << '\n' //Gibt eine Adresse zurück, der operator<<(const char*) ist entsprechend überladen dass er bis zum Terminierungszeichen liest (und ausgibt)
                  << *"asdf" << '\n';//Dereferenziert die Adresse und liest entsprechend nur das erste Zeichen (auf das der zurückgegebene Zeiger zeigt)
    }
    

    Oder:

    #include <cstdio>
    
    void out(const char* a)
    {
        while(*a) // ODER while(*a != '\0')
            std::printf("%c", *(a++));
    }
    
    int main()
    {
        out("asdf");
    }
    


  • Rokko78 schrieb:

    wenn ich dann char in char* umwandel :

    int main()
    {
    char* a = "0";
    cin >> a;
    if (a == "m") cout << .........
    if (a == "w" cout << ..........
    }

    Bekomme ich keine Fehlermeldung mehr ABER die Variable a hat keinen Wert. Noch nicht einmal 0 ??

    Jemand eine Idee ??
    Danke

    Weil es sich in diesem Fall bei a um einen Zeiger auf char handelt und somit eine Speicheradresse erwartet.

    Gruss


Anmelden zum Antworten