C++ Zwei char vergleichen

Ach du Scheiße!

Zuerst wird hier eine steinalte IDE (DevC++) verwendet, die seit 1857 nicht mehr weiterentwickelt wird und dann werden im C++-Code auch noch massenweise C-Header inkludiert. Der Buffer Overflow lässt bei 256 Zeichen grüßen.

In C++ gibt es die Header string.

Code:
#include <string>

Eine Templateklasse. Warum hier cstring und auch noch cstdio zusammen mit iostream verwendet wird bleibt wohl ein Geheimnis für alle Ewigkeit.

Gruselig, ein C mit C++ Brei... :freak:
 
Nun gib's ihm mal nicht gleich so hart. Er ist offensichtlich noch neu beim Thema C++ ... am Anfang schreibt da wohl jeder gruseligen Code. Was die guten Programmierer von den schlechten trennt, ist daß der Code den sie 4 Jahre später schreiben, mit dem den sie zu Beginn fabrizierten, nichts mehr gemein hat. ;)
 
Das hat nichts mit Härte zu tun, sondern mit Korrektheit. Wenn man C++ verwendet, dann sollte man auch C++ verwenden und nicht eine Mischung aus C und C++. Als nächstes kommt er auf die Idee new und malloc in einem Programm zu mischen.

PHP:
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;

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

    string namen[][2] = { { "Ritchie", "Blackmore"}, { "Curt", "Cobain"}, { "Pat" ,"Metheny" }, 
                          { "Carlos", "Santana" }, { "George", "Harrison" }, { "Rudolf", "Schenker" }, 
                          { "George", "Benson" }, { "Joe", "Satriani" }, { "Brian", "May" }, 
                          { "Mark", "Knopfler" }, { "Steve", "Lukather" }, { "Jimi", "Hendrix"} };
    string eingabe;

    do {
        bool durchlauf = true;
        cout << "\nWie lautet der Vorname von folgendem Gitarristen? " << endl;
        srand((unsigned int)time(NULL));
        int i = rand() % 12;
        cout << namen[i][0] << endl;

        do {   
            cout << "\nEingabe: ";
            cin >> eingabe;

            if (namen[i][1] != eingabe) {
                cout << "Falsch!";
            } else {
                cout << "Richtig!" << endl;
                durchlauf = false;
            }
        } while(durchlauf);

        cout << "Nochmal (j/n)? ";
        cin >> eingabe;
    } while(eingabe == "j" || eingabe == "J");

    return EXIT_SUCCESS;
}

Hier würde sich übrigens std::map<Key, Data, Compare, Alloc> anbieten, aber wir wollen ja nicht übertreiben.
 
Zuletzt bearbeitet:
Was ist an einer einfachen map übertrieben?
Sieht ja letzendlich nur so aus: std::map<std::string, std::string>, da man sowohl den standardmäßigen Vergleich als auch Allocator benutzen kann.
Einfügen in eine map einfach mit insert:
Code:
map_instance.insert(make_pair<std::string, std::string>("Ritchie", "Blackmore"));
Hinweis: make_pair ist im Header utility

Gruß,

badday
 
Was an einer std::map übertrieben ist? Hmmm, eine gute Frage.

Vielleicht, weil der Threadersteller schon Probleme hat std::string zu verwenden, von einem sortierten assoziativen Container aus der STL einmal ganz zu schweigen.

Aber das musst du nicht mit mir abklären, sondern mit dem TE. Ich weiß wie, wann und wo man eine map einsetzt.
 
Stefan_Sch schrieb:
Das hat nichts mit Härte zu tun, sondern mit Korrektheit. Wenn man C++ verwendet, dann sollte man auch C++ verwenden und nicht eine Mischung aus C und C++.

...
srand((unsigned int)time(NULL));

Dann solltest du aber auch keine c-like typecasts machen, auch wenn es in diesem Fall natürlich völlig in Ordnung wäre :D
 
inter2k3 schrieb:
Dann solltest du aber auch keine c-like typecasts machen, auch wenn es in diesem Fall natürlich völlig in Ordnung wäre

Es handelt sich dabei aber um einen expliziten Cast, der sowohl als static_cast, als auch als C-Cast durchgeführt werden kann.

http://www.cplusplus.com/doc/tutorial/typecasting/

Den Ausdruck

Code:
srand((unsigned int)time(NULL));

würde der Compiler nämlich auch ohne Cast implizit konvertieren. ;)
 
Trotzdem bleibt es aber immer noch ein C-style cast, den du ja konsequenterweise in einem C++-Programm eigentlich als "C mit C++ Brei" verwerfen solltest. :p
 
Das ist falsch! Der C++ Standard sagt diesbezüglich im Kapitel 5.4 Absatz 2.

An explicit type conversion can be expressed using functional notation (5.2.3), a type conversion operator (dynamic_cast, static_cast, reinterpret_cast, const_cast), or the cast notation.

cast-expression:
unary-expression
( type-id ) cast-expression

Was lernen wir daraus? Richtig, mit einem C-Style Cast kann auch offiziell in C++ explizit gecastet werden, es handelt sich hier nämlich nicht um eine C-Funktion, sondern wie der Name schon sagt um einen Cast nach C-Stilistik. Dieser Stil wird übrigens auch in Java oder C# verwendet.

Willst du nun behaupten dass das dann ein "C mit Java Brei" wäre. LOL
 
Zuletzt bearbeitet:
Der C++ Standard sagt damit aus, daß diese Syntax von jedem standardkonformen Compiler unterstützt werden muß, sonst nichts. Daß C++ viel C-Rückwärtskompatibilitätsgepäck mit sich rumschleppt, wird sicherlich niemand vom Hocker hauen. Daß solche Casts in einem C++-Programm nichts verloren haben, dürfte wohl trotzdem klar sein.
 
antred schrieb:
Der C++ Standard sagt damit aus, daß diese Syntax von jedem standardkonformen Compiler unterstützt werden muß, sonst nichts.

Der C++ Standard bezieht diese Art der Typkonvertierung explizit ein, es ist also Teil der Sprache C++!

antred schrieb:
Daß solche Casts in einem C++-Programm nichts verloren haben, dürfte wohl trotzdem klar sein.

Das ist falsch. Ein Cast ist nicht gleich Cast. C++ Casts wurden eingeführt, um z.B. den Unterschied zwischen einem Cast, der einen Zeiger auf ein konstantes Objekt in einen Zeiger auf ein nichtkonstantes Objekt umwandelt und einem Cast zwischen einem Zeiger auf eine Basisklasse in einen Zeiger auf eine abgeleitete Klasse kenntlich zu machen. Hier konnte der C-Style Cast keine Unterscheidung treffen.

C-Style Casts bei einfachen Typkonvertierungen von ganzzahligen Datentypen zu verwenden stellt in C++ kein Problem dar, da die Umwandlung eines ganzzahligen Typs in einen kleineren Datentyp implizit durch das Abschneiden der höherwertigen Bits erfolgt.
 
Stefan_Sch schrieb:
Der C++ Standard bezieht diese Art der Typkonvertierung explizit ein, es ist also Teil der Sprache C++!

Logisch ist es Teil der Sprache. Deswegen ist es aber noch lange kein guter Stil. Und stilistisch ist das ja wohl eindeutig eher C als C++. Ich kann genau so gut eine Klasse mit 3000 Memberfunktionen und Variablen erstellen und die alle public machen ... ist laut Standard alles erlaubt und hat der Compiler zu schlucken. Stimmst mir sicher zu, daß es trotzdem eine dämliche Idee wäre.
 
Willst du mir nun weismachen das eine C-Style Typkonvertierung der folgenden Art

Code:
srand((unsigned int) time(NULL))

eine "dämliche Idee" ist? Dann schieß mal los, ich bin schon sehr gespannt wie du diese Aussage begründen willst und welche expliziten Vorteile hier ein static_cast<> hätte.

Wohlgemerkt, die Typkonvertierung von ganzzahligen Typen in kleinere Datentyp ist implizit durch das Abschneiden der höherwertigen Bits im Standard vorgesehen.

Die Funktion akzeptiert ohnehin nur Parameter der Größe size_t.

Code:
srand(time(NULL));

Erzähl mal!
 
'Dämliche Idee' ist jetzt vielleicht ein bißchen krass ausgedrückt ... man kriegt keinen Fußpilz oder Herpes, bloß weil man C-Casts benutzt, aber C++ stellt extra zu diesem Zweck die Cast-Operatoren zur Verfügung, also sollte man ihnen auch den Vorzug geben.
Ein Vorteil ist, daß man nach 'static_cast' zum Beispiel sehr leicht suchen kann und damit im Code leicht stellen finden kann, an denen gecastet wird. Sucht man nach 'unsigned int', gestaltet sich die Suche schon wesentlich schwieriger.
Außerdem ist der C-Cast einfach nur wie ein Vorschlaghammer ... wenn's überhaupt irgend wie möglich ist, castet der dir fast alles, egal ob das Sinn macht oder nicht, während dir die C++ Cast-Operatoren unter Umständen den Vogel zeigen, wenn du etwas castet, das ganz sicher völlig bescheuert ist.
 
Es hat auch niemand behauptet man solle C-Style Casts in C++ bevorzugen!

Das heißt aber nicht das bei trivialen Typumwandlungen, wie der obigen, wo die Funktion ohnehin nur einen unsigned int für den Seed entgegen nimmt, unbedingt ein static_cast<> herangezogen werden muss. Es bringt keinerlei Vorteile.
 
@Stefan_Sch

Von einem Anfänger kann man nicht erwarten, dass er den C++ Standard kennt und die STL aus dem Effeff beherrscht. Die 'steinalte' IDE erfüllt ihren Zweck und das Programm war bereits vor Deinen Einwürfen komplett.

Wichtig ist, dass der TE daraus etwas lernen kann und versteht, wie sein Programm funktioniert. In die Gefilde eines C++ Gurus kann er später immer noch aufsteigen ;)
 
Es erwartet auch niemand das ein Anfänger C++ beherrscht. Ich persönlich war vor vielen Jahren froh, Ratschläge von C++-Experten zu erhalten, die mir meine Fehler aufzeigten und mir dabei halfen Sachverhalte besser zu verstehen.

Lernen heißt auch seine eigenen Fehler zu erkennen und es in Zukunft besser zu machen. Leider spielen heute die meisten Leute verrückt, wenn man sie auf Fehler hinweist und betrachten das als einen Angriff auf ihr Ego. Anderen scheint es vollkommen egal zu sein, sie machen weiter wie gewohnt, irreparable Faktenresistenz.

DevC++ ist eine IDE die nicht mehr weiterenwickelt wird und keinen standardkonformen Compiler bereitstellt. Es ist nicht ratsam so eine IDE zu verwenden, zumal es unzählige kostenlose und bessere Entwicklungsumgebungen gibt!

Winterday schrieb:
In die Gefilde eines C++ Gurus kann er später immer noch aufsteigen

Das wird er nie, wenn er nicht lernt seine eigenen Fehler einzusehen.
 
Zuletzt bearbeitet:
Stefan_Sch schrieb:
DevC++ ist eine IDE die nicht mehr weiterenwickelt wird und keinen standardkonformen Compiler bereitstellt. Es ist nicht ratsam so eine IDE zu verwenden, zumal es unzählige kostenlose und bessere Entwicklungsumgebungen gibt!

Stimmt. Ich empfehle hier Visual Studio 2010 ... wer nichts bezahlen möchte, nimmt halt die kostenlose Express-Version. :)
 
Welche IDE ist denn bitte prinzipiell plattformunabhängig? Und wieso ist das überhaupt von Interesse? Du entwickelst auf Linux? Dann nimm die für dich beste IDE, die es unter Linux gibt. Du entwickelst unter Windows? Dann nimm die beste, die es für Windows gibt (meiner Meinung nach Visual Studio ... andere mögen andere Vorzüge haben).
 
Zurück
Oben