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.


Anmelden zum Antworten