C++ Zwei char vergleichen

PGJ

Lt. Junior Grade
Registriert
Mai 2005
Beiträge
398
Hallo Leute,

ihr könnt mir bestimmt weiterhelfen: Die Aufgabe ist es, ein Programm zu erstellen, dass einen Nachnamen von einem bekannten Gitarristen ausgibt und man dann den Vornamen eingeben soll. Vor- und Nachname werden natürlich bzgl. Stimmigkeit überprüft.

Soweit habe ich schon das Programm geschrieben:
Code:
#include <cstdlib>
#include <iostream>
#include <string.h>
char nachname[14][12]={"Blackmore","Cobain","Metheny","Santana","Harrison","Schenker","Benson","Satriani","May","Knopfler","Lukather","Hendrix"};
char vorname[14][12]={"Ritchie","Curt","Pat","Carlos","George","Rudolf","George","Joe","Brian","Mark","Steve","Jimi"};
char eingabe[255];
int strcmp( const char *nachname, const char *eingabe );
using namespace std;


int main(int argc, char *argv[])
{

    cout<<"Wie lautet der Vorname von folgendem Gitarristen?:" << endl;
    srand((unsigned) time(NULL));
    int i=(rand()+ 0)%13;
    cout << nachname[i] << endl;
    cout << endl;
    cout << "Eingabe: ";
    cin >> eingabe[255];
    
    
    if (strcmp(nachname[i], eingabe[255])=0)
    {
            cout<<"Richtig!";
    }
    else
    {
        cout<<"Falsch!";
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}

Jedoch zickt Dev C++ bei if (strcmp(nachname, eingabe[255])=0) rum, dass er char nicht in const char umwandeln kann, denn strcmp setzt const char voraus.

Könnt ihr mir bei dem Problem helfen?
Vielen dank im Voraus!
 
Zuletzt bearbeitet:
1. Vergleich mit "==", denn "=" ist eine Zuweisung
2. eingabe[255] ist das erste Zeichen nach deinem Array. Du willst ja die Arrays vergleichen

Code:
    if (strcmp(nachname[i], eingabe) == 0)
    {
            cout<<"Richtig!";
    }
    else
    {
        cout<<"Falsch!";
    }
 
Geht == einfach so? Ich habe wenig bis keine Ahnung von C++ aber bei Java kann man, meine ich, Strings nicht einfach mit == vergleichen - das liegt irgendwie an der Objektbehandlung. Hier muss man auch die gegebene Funktionen dafür nutzen. Kein Anspruch auf Korrektheit!

Wie sieht es denn mit reg. Ausdrücken aus? Damit sollte man doch "relativ" einfach zwei Strings vergleichen können.
Ergänzung ()

Kann auch sein, dass == nur beim null-Vergleich nicht geht.
 
Wenn man schon C++ programmiert, kann man auch die Klasse string verwenden. Dann ist == auch möglich.

Bei char Arrays werden bei == die Speicheradressen der Arrays verglichen. Das ist jedoch hier nicht gewünscht, daher strcmp().
 
richtig müsste es heißen:

Code:
#include <time.h>
fehlt für den befehl time(NULL)

Außerdem:
Code:
cin >> eingabe;

if (strcmp(nachname[i], eingabe)==0)
{


außerdem wunder ich mich über das
Code:
int strcmp( const char *nachname, const char *eingabe );

Das gehört dort absolut nicht hin, außer du definierst selber die funktion später, aber dann solltest du wissen wie man sie aufruft.
 
Zuletzt bearbeitet:
Leider ist das Char Array eine Vorgabe, die ich leider nicht verwerfen darf.
Also ich habe das Programm jetzt noch mal überarbeitet, aber auch wenn man den richtigen Namen eingibt, wird er als falsch ausgegeben:
Code:
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <time.h>

char nachname[14][11]={"Blackmore","Cobain","Metheny","Santana","Harrison","Schenker","Benson","Satriani","May","Knopfler","Lukather","Hendrix"};
char vorname[14][12]={"Ritchie","Curt","Pat","Carlos","George","Rudolf","George","Joe","Brian","Mark","Steve","Jimi"};
char eingabe[255];
using namespace std;


int main(int argc, char *argv[])
{

    cout<<"Wie lautet der Vorname von folgendem Gitarristen?:" << endl;
    srand((unsigned) time(NULL));
    int i=(rand()+ 0)%12;
    cout << nachname[i] << endl;
    cout << endl;
    cout << "Eingabe: ";
    cin >> eingabe;
    
    
    if (strcmp(nachname[i], eingabe) != 0)
    {
            cout<<"Falsch!";
    }
    else
    {
        cout<<"Richtig!";
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet:
Du vergleichst ja die Eingabe (Vorname) mit dem Nachnamen... kann ja nix werden.

strcmp(vorname, eingabe) !

Gruß
 
1. cin >> eingabe;
2. if (strcmp(vorname, eingabe) != 0)
 
Ah, Brett vorm Kopf ^^. Danke kevchen01!

Hier jetzt das funktionierende Script:
Code:
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <time.h>

char nachname[14][11]={"Blackmore","Cobain","Metheny","Santana","Harrison","Schenker","Benson","Satriani","May","Knopfler","Lukather","Hendrix"};
char vorname[14][12]={"Ritchie","Curt","Pat","Carlos","George","Rudolf","George","Joe","Brian","Mark","Steve","Jimi"};
char eingabe[255];
using namespace std;


int main(int argc, char *argv[])
{

    cout<<"Wie lautet der Vorname von folgendem Gitarristen?:" << endl;
    srand((unsigned) time(NULL));
    int i=(rand()+ 0)%12;
    cout << nachname[i] << endl;
    cout << endl;
    cout << "Eingabe: ";
    cin >> eingabe;
    
    
    if (strcmp(vorname[i], eingabe) != 0)
    {
            cout<<"Falsch!";
    }
    else
    {
        cout<<"Richtig!";
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
Ergänzung ()

Hallo noch mal:
ich wollte jetzt das Programm noche etwas weiter ergänzen: Die Abfrage zu dem Vornamen soll so oft kommen, bis sie richtig ist. Das habe ich jetzt mit einer do while Schleife umgesetzt, aber warum funktioniert die nicht? Irgendwie hab ich nen Brett vorm Kopf:
Code:
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <time.h>

char nachname[14][11]={"Blackmore","Cobain","Metheny","Santana","Harrison","Schenker","Benson","Satriani","May","Knopfler","Lukather","Hendrix"};
char vorname[14][12]={"Ritchie","Curt","Pat","Carlos","George","Rudolf","George","Joe","Brian","Mark","Steve","Jimi"};
char eingabe[255];
int durchlauf=0;
using namespace std;


int main(int argc, char *argv[])
{

    cout<<"Wie lautet der Vorname von folgendem Gitarristen?:" << endl;
    srand((unsigned) time(NULL));
    int i=(rand()+ 0)%12;
    cout << nachname[i] << endl;
    do
    {
    cout << endl;
    cout << "Eingabe: ";
    cin >> eingabe;
    

    if (strcmp(vorname[i], eingabe) != 0)
    {
            cout<<"Falsch!";
            durchlauf=0;
    }
    else
    {
        cout<<"Richtig!";
        durchlauf++;
    }
    }while(durchlauf!=0);

    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Wenn es falsch ist, setzt du doch durchlauf auf null! ----- while durchlauf!=0 wird die schleife fortgeführt. Aber sie muss doch bei null fortgeführt werden.

EDIT: Ich würde bei falschen Angaben durchlauf um 1 erhöhen, dann kannst du die Anzahl der Versuche zählen.

EDIT2: Bei solchen Fällen kann ein schrittweises debuggen helfen, um eventuelle Gedankenfehler herauszufinden. Wenn man bestimmte Variablen beobachtet kann man sehr schnell diese Fehler finden, warum was gemacht wird, oder auch nicht.

Gruß
 
Zuletzt bearbeitet:
tausch mal die die zuweisung von durchlauf aus. das ist wohl eher das was du meinst:

Code:
do {
    ...

    if (strcmp(vorname[i], eingabe) != 0)
    {
        cout<<"Falsch!";
        durchlauf++;
    }
    else
    {
        cout<<"Richtig!";
        durchlauf=0;
    }
} while(durchlauf!=0);
 
Und noch eine kleine Krümelkackerei von mir. ;)

Code:
// Das ist laut C++ Standard veraltet ...
#include <string.h>

// besser wäre ...
#include <cstring>
 
Super! Danke für eure zahlreichen Tipps!

Ich will jetzt nur noch eine einzige Sache ergänzen: Es soll eine Abfrage kommen, wenn die Antwort richtig war, ob noch ein weiterer Gitarrist abgefragt werden soll. Nur irgendwie wird die Eingabe nicht richtig eingelesen und es wird das Programm beendet... es gibt schon einen Grund, warum ich Programmieren hasse -_-... aber ihr habt bestimmt dafür auch einen Tipp:

Code:
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <time.h>

char nachname[14][11]={"Blackmore","Cobain","Metheny","Santana","Harrison","Schenker","Benson","Satriani","May","Knopfler","Lukather","Hendrix"};
char vorname[14][12]={"Ritchie","Curt","Pat","Carlos","George","Rudolf","George","Joe","Brian","Mark","Steve","Jimi"};
char eingabe[255];
int durchlauf=0;
char auswahl[1];
using namespace std;


int main(int argc, char *argv[])
{
do{
    cout<<"Wie lautet der Vorname von folgendem Gitarristen?:" << endl;
    srand((unsigned) time(NULL));
    int i=(rand()+ 0)%12;
    cout << nachname[i] << endl;

    do
    {   
    cout << endl;
    cout << "Eingabe: ";
    cin >> eingabe;


    if (strcmp(vorname[i], eingabe) != 0)
    {
        cout<<"Falsch!";
        durchlauf++;
    }
    else
    {
        cout<<"Richtig!" << endl;
        cout<<"Nochmal (j / n)?: ";
        cin.getline (auswahl, 1);
        if (strcmp(auswahl, "j") == 0)
        {
               durchlauf=0;
        }
    }
} while(durchlauf!=0);
} while (auswahl == "n");
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Dann setz doch in deinem if-block mal 'durchlauf' auf 1 und nicht auf 0. ;)
Ergänzung ()

Und noch was ... was soll das mit den ganzen globalen Variablen? Muß doch nicht sein. Pack die einfach alle in die main()-Funktion. Außerdem .... wenn du Arrays mit einer Initialisierungliste anlegst, mußt du nicht explizit die Anzahl der Elemente angeben. Der Compiler macht die Arrays schon von allein groß genug.

Code:
const char* nachname[]={"Blackmore","Cobain","Metheny","Santana","Harrison","Schenker","Benson","Satriani","May","Knopfler","Lukather","Hendrix"};
const char* vorname[]={"Ritchie","Curt","Pat","Carlos","George","Rudolf","George","Joe","Brian","Mark","Steve","Jimi"};

Ach ja, und Deine Namens-Arrays sollten 'const' sein. Du willst ja schließlich ihren Inhalt nicht verändern. Mit 'const' sagst du dem Compiler, daß er doch diese Tatsache auch bitte sicherstellen soll, so daß du nicht später irgend welchen Code hinzufügst, mit dem du dann aus Versehen doch den Inhalt des Arrays veränderst.

Nächster Punkt. Dein 'eingabe'-Array sollte wie folgt initialisiert werden:

Code:
char eingabe[255] = {};

Damit stellst du sicher, daß alle Elemente des Arrays mit ihrem Default-Wert vorbelegt sind ... für char ist das 0. Da das Array global ist, wird es zwar sowie default-initialisiert, aber wie schon mal gesagt, sollte es eigentlich gar nicht global sein. Es ist eine gute Regel, Variablen immer mit dem kleinstmöglichen Gültigkeitsbereich anzulegen ... und in deinem Fall gibt es keine einzige Variable, die außerhalb von main() überhaupt existieren muß.

Die 'durchlauf'-Variable sollte ein bool und nicht ein int sein ... schließlich sind die einzigen sinnvollen Werte, die sie enthalten kann, Null und nicht Null ... also false und true.

Weiter ... mit time.h verhält es sich genau so wie mit string.h ... veraltet ... richtig wäre ctime. ;)

Und besser als das ganze fehleranfällige Rumgeeiere mit Characterarrays wäre es, die std::string-Klasse zu verwenden. Das ist wesentlich einfacher und sicherer. Die findest du übrigens im Header <string>. ;)
 
*edit: Okay, danke für die Hinweise!

Das Programm ist jetzt fertig:
Code:
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <ctime>
#include <cstdio>


int main(int argc, char *argv[])
{

const char* nachname[]={"Blackmore","Cobain","Metheny","Santana","Harrison","Schenker","Benson","Satriani","May","Knopfler","Lukather","Hendrix"};
const char* vorname[]={"Ritchie","Curt","Pat","Carlos","George","Rudolf","George","Joe","Brian","Mark","Steve","Jimi"};
char eingabe[255]={};
bool durchlauf;
char auswahl;
bool nochmal;
using namespace std;

do {
    cout<<"Wie lautet der Vorname von folgendem Gitarristen?:" << endl;
    srand((unsigned) time(NULL));
    int i=(rand()+ 0)%12;
    cout << nachname[i] << endl;

    do
    {   
    cout << endl;
    cout << "Eingabe: ";
    cin >> eingabe;


    if (strcmp(vorname[i], eingabe) != 0)
    {
        cout<<"Falsch!";
        durchlauf=true;
    }
    else
    {
        cout<<"Richtig!" << endl;
        durchlauf=false;
    }
} while(durchlauf!=false);
cout << "Nochmal (j/n)?: ";
cin >> auswahl;
nochmal=(auswahl=='j' | auswahl=='J');
cout << endl;

}while(nochmal);

    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet:
Zurück
Oben