Warum funktioniert der Vergleich von char Array's nicht?



  • es muss heißen:

    if(a == b)      //dies wird aber immer false geben, 
                    //da die zeiger auf das array verglichen werden  
                    //und diese ja nie gleich sein können
    

    wenn dann musst du schon eine schleife benutzen und jeden eintrag vergleichen oder du nimmst string... dann ist das vergleichen kein problem...



  • Das war ja auch ein Beispiel ... da achte ich nicht so genau darauf!



  • !strcmp, !memcmp, bzw std::string 😉



  • #include <iostream>
    
    using namespace std;
    
    int main()
    {
        char ProduktTypus[40]; 
        char Produkt1[40] = "Auto";
        cout << "Welches Produkt wollen Sie berechnen lassen\?\n";
        cin >> ProduktTypus;
        cout << ProduktTypus;
        if(ProduktTypus == Produkt1)
           cout << "Auto!!!\n";
        else 
           cout << "Nix\n";     
        system ("pause");   
        return 0;
    }
    

    Ok also hier der Anfang!
    Ich will jetzt einfach nur Wissen Warum immer Falsch ausgegeben wird ... und wie ich das beheben kann!



  • Ok hab es mit String gemacht ... trotzdem danke!



  • wilkommen in der wunderwelt von c/c++ 😃

    also das problem ist, daß c/c++ eigentlich keine strings kennt. strings werden hier als zeiger auf char-arrays nachgebildet. der ausdruck a==b vergleicht nicht die strings sondern die zeiger! die lösung ist

    #include<iostream>   // wegen cout
    #include<cstring>    // wegen strcmp()
    
    using namespace std; // wegen sowiso - darf in c++ eigentlich nie fehlen
    
    char a[5] = "Test"; 
    char b[5] = "Test"; 
    if(strcmp(a,b)==0) 
      cout << "Egal"<<endl;
    

    übrigens hast du einen typischen anfängerfehler gemacht und a=b anstatt a==b geschrieben. a=b ist eine zuweisung und kein vergleich! das schlimme ist, daß dir der compiler da keinen fehler meldet, da es sich bei if(a=b) um ganz legalen c-code handelt! es wird die zuweisung nach a durchgeführt und anschließend a auf ungleich null geprüft!

    und selbst wenn du if(a==b) geschrieben hättest, wäre es immer noch falsch gewesen! denn wie schon gesagt, kann man in c/c++ strings nicht einfach so vergleichen. dazu gibts eine eigene funktion namens strcmp(). außer du nimmst die string-klasse der standard-bibliothek, dann gehts auch mit ==.

    dann ist das If in If(a=b) auch falsch! das muß klein geschrieben sein. im gegensatz zu vb unterscheidet c/c++ immer die groß/kleinschreibung!

    deine char-array-größen sind falsch! die müssen immer um eins länger sein als der string wegen dem abschließenden nullbyte. in c/c++ wird das ende eines strings markiert, indem an das stringende ein zeichen mit ascii-code null gesetzt wird. dadurch wird das char-array immer um ein byte größer als die länge des strings.

    und die semikolons hast du auch noch vergessen...

    dann noch ein schönheitsfehler. cout<<"Egal\n" funktioniert zwar, macht aber keinen guten eindruck 🤡. in c++ gibt man das zeilenende mit endl aus. also cout<<"Egal"<<endl.

    au weia...

    aber laß dich von deinen vielen fehlern nicht entmutigen. der kulturschock beim umstieg auf c/c++ ist für jeden hart. da bist du nicht der einzige 😃



  • hab garnicht gemerkt, daß dir schon so viele andere eins auf den deckel gegeben haben. da hätte ich dir meinen senf ja ersparen können 😃



  • Ich hab es jetzt auf Komplizierten weg mit GetString gemacht ... Problem ist jetzt nur ... wie kann ich jetzt per cin diesen String aus der String Klasse füllen?
    Gibt es zum Beispiel die möglichkeit eines SetString ??? also ich hab mal in der Headerfile geguckt aber nix gefunden.

    So wie Sie müsste hier mal jeder Antworten ... da versteht man schon wesentlich mehr! Bis jetzt wurde ich ja schon ein wenig durch VB & QBasic verwöhnt ... aber in C++ muss man teilweise aus einfachen Problemen, eine Komplizierte Sache machen ... naja das lern ich schon noch 🙄



  • Konfusius schrieb:

    übrigens hast du einen typischen anfängerfehler gemacht und a=b anstatt a==b geschrieben. a=b ist eine zuweisung und kein vergleich! das schlimme ist, daß dir der compiler da keinen fehler meldet, da es sich bei if(a=b) um ganz legalen c-code handelt! es wird die zuweisung nach a durchgeführt und anschließend a auf ungleich null geprüft!

    Das ist eben _nicht_ legal nach ISO-C++. Dieses verbietet die Zuweisung von Arrays. (Meldet zumindest der g++)

    dann noch ein schönheitsfehler. cout<<"Egal\n" funktioniert zwar, macht aber keinen guten eindruck 🤡. in c++ gibt man das zeilenende mit endl aus. also cout<<"Egal"<<endl.

    Das ist _kein_ Schönheitsfehler. Denn es gibt einen Unterschied zwischen '\n' und endl.
    Zusätzlich zu '\n' flusht endl noch den Stream.
    Im Prinzip ist

    cout << endl;
    

    das gleiche wie

    cout << '\n' << flush;
    

    Caipi



  • FoxDie schrieb:

    Ich hab es jetzt auf Komplizierten weg mit GetString gemacht ... Problem ist jetzt nur ... wie kann ich jetzt per cin diesen String aus der String Klasse füllen?

    Nimm std::string, dann ist das mit cin kein Problem.

    string s;
    cin >> s;
    // bzw.
    getline(cin, s);
    

    FoxDie schrieb:

    aber in C++ muss man teilweise aus einfachen Problemen, eine Komplizierte Sache machen

    Nicht unbedingt, du musst nur wissen, wie du es richtig machst. Die wirklich komplizierten Sachen kommen erst noch. 🙂


Anmelden zum Antworten