std::string liefert falschen const char*?
-
Hallo liebe Community,
ich wollte mich eben dran machen und ein Vokabel-Lern-Programm programmieren und möchte so viel wie möglich mit Klassen arbeiten. Ich habe bisher lediglich eine Klasse namens*Vokabel*implementiert, die folgendermaßen aussieht:#pragma once class Vokabel { public: Vokabel(const char* n, const char* u); bool check(const char* eingabe); const char* getName(); private: const char* name; const char* uebersetzung; };#include "Vokabel.h" Vokabel::Vokabel(const char* n, const char* u) : name(n), uebersetzung(u) { } bool Vokabel::check(const char* eingabe) { return (eingabe == uebersetzung); } const char* Vokabel::getName() { return name; }In meiner Main-Funktion wird eine Vokabel abgefragt und geprüft, ob die Übersetzung korrekt ist. Jedoch wird dort die Eingabe falsch ausgewertet und immer mit "Falsche Antwort" beendet.
#include <iostream> #include "Vokabel.h" #include <string> #include <conio.h> int main() { std::string eingabe; Vokabel vok1("Auto", "Car"); std::cout << vok1.getName() << ": "; std::cin >> eingabe; if(vok1.check(eingabe.c_str())) std::cout << "Richtige Antwort!"; else std::cout << "Falsche Antwort!"; _getch(); }Ich glaube es hat etwas mit der Memberfunktion*
c_str()*aus der String-Klasse zu tun.
-
Du kannst Pointer nicht mit == vergleichen. Zumindest macht der Vergleich nicht das, was du vielleicht denkst.
Nimm std::string statt char*, und alles wird gut.
-
Was vergleicht es denn?
-
Klapperstorch schrieb:
Was vergleicht es denn?
Die Zeiger.
-
Und wieso werden dann keine Adressen ausgegeben, wenn ich schreibe:
const char* ptr = "Hallo"; std::cout << ptr;sondern der Inhalt des Zeigers?
-
Weil operator<< für char* und const char* überladen ist.
-
Achso, okay danke Euch

Leider bin ich bisher noch nicht an dem Kapitel angelangt.
-
Klapperstorch schrieb:
Und wieso werden dann keine Adressen ausgegeben, wenn ich schreibe:
const char* ptr = "Hallo"; std::cout << ptr;sondern der Inhalt des Zeigers?
Wie DocShoe schon sagte, sind die operator<< für diverse Standardtypen überladen.
Für Pointer auf built-ins wird dabei die Adresse ausgegeben, außer bei Pointern auf char*, da wird die Zeichenkette selber ausgegeben.
Diese Ausnahme wurde eingefügt, um Literal-Zeichenketten einfacher auszugeben.
operator== ist jedoch nicht von den Machern der Standardbibliothek überladen und macht deshalb das, was es bei Pointern immer macht: die Adressen vergleichen.
Die (beste) Lösung wurde ebenfalls schon genannt:
Nutze std::string. Der operator== von std::string vergleicht die Werte der Zeichenketten.