Buchstabenfinder



  • Guten Tag,

    ich habe hier ein programm welches einen buchstaben in einem wort finden soll. Anschließend die position des buchstaben ausgeben soll andernfalls eine "-1" als ausgabe geben soll. Das Programm funktioniert soweit, jedoch habe ich ein problem mit der ausgabe.

    momentan gibt er mir wenn ich zb das wort "hallo" eingebe und den Buchstaben "o" suche
    -1
    -1
    -1
    -1
    Position :4

    ich will aber das er mir nur die position ausgibt.

    #include<iostream>
    using namespace std;
    
    void findCharacter(char* Wort);
    
    void findCharacter(char* Wort)
    {
    
    	cout << "Welchen Buchstaben wollen Sie suchen? " << endl;
    	char Buchstabe = '\0';
    	int counter = 0;
    	cin >> Buchstabe;
    
    	for (int i = 0; i < 5; i++)
    	{
    		if (Wort[i] == Buchstabe) 
    		{
    			cout << "Position: " << i << endl; 
    		}
    		else if (Wort[i] != Buchstabe)
    		{
    			cout << "-1" << endl;
    		}
    	}
    }
    
    	int main()
    {
    
    	char Wort[5] = {}; 
    	char eingabe = '\0';
    	cout << "Buchstabenfinder - Bitte ein Wort eingeben: " << endl;
    	cin >> Wort;
    
    	do{				
    		findCharacter(Wort);
    		cout << "Moechten Sie noch einen Buchstaben finden?[j/n] " << endl;
    		cin >> eingabe;
    		if (eingabe == 'j')
    		{
    			continue;
    		}
    		else
    		{		
    			run = true; 
    		}
    	} while (run == false); 
    	cout << "Bis bald! " << endl;
    
    	system("pause");
    	return 0;
    }
    


  • Dann schaust du mal im Code nach, wo die -1 ausgegeben wird und änderst diese Zeile.



  • Mit der Aussage kann ich jetzt nicht viel erreichen. 😕
    Wohin soll ich das dann tun ?



  • Wie würdest du es den mit einem Blatt Papier mit Text drauf machen? Genau, den Text durchgehen und wenn das gesuchte Zeichen gesichtet wurde sich freuen und den Text nicht weiter durchgehen.



  • Den Text soll man aber bis ende durchgehen, falls der gesuchte Buchstabe mehrmals auftaucht



  • Gut. Wie würdest du sowas in real life machen?



  • Buchstabe für Buchstabe durchgehen und sobald der gesuchte Buchstabe gefunden wurde die Stellen ausgeben und bei nicht finden des buchstabens ebenfalls eine ausgabe, wie in diesem fall eine -1

    Ok habs raus :D, danke für die Gedankenstützen 🙂



  • mc52 schrieb:

    momentan gibt er mir wenn ich zb das wort "hallo" eingebe und den Buchstaben "o" suche
    -1
    -1
    -1
    -1
    Position :4

    Da hast du aber Glück. Da hätte auch alles andere passieren können. Du siehst als Puffer für deine Worteingabe nur 4 Zeichen vor, das ist in den meisten Fällen wohl zu wenig.



  • Hab erstmal "run" definiert und was krieg ich dann?

    Run-Time Check Failure #2 - Stack around the variable 'Wort' was corrupted.

    Na sowas, eigentlich wollte ich den Stack selbst kaputt hauen (um SeppJ eine kleine Freude zu bereiten ;)).

    EDIT:
    Ja, ich bin zurück.



  • Ich wär dafür, dass wir ein "C mit cin/cout" Unterforum einführen...

    void findCharIn(const char *wennsHaltNenCStringSeinMuss)
    {
        cout << "Welchen Buchstaben wollen Sie suchen?\n";
        char buchstabe;
        cin >> buchstabe;
    
        int pos = 0;
        while (wennsHaltNenCStringSeinMuss[pos] /* != '\0' */)
        {
            if (wennsHaltNenCStringSeinMuss[pos] == buchstabe)
            {
                cout << "Position: " << pos << '\n';
                return;
            }
            ++pos;
        }
        cout << "-1\n";
    }
    

    Kann man eventuell noch besser machen, aber mir gehts hier drum einen bestimmten Sachverhalt zu vermitteln: C-Style strings sind null-terminiert.

    In anderen Worten, wenn du sagst findChar("Hallo"), dann sieht das so aus:

    wort:
    ['H', 'a', 'l', 'l', 'o', '\0']

    Das letzte nennt sich ein Null-char, oder irgendwie so. Anscheinend ist dir dieser schon bekannt.

    Wenn wir davon ausgehen, dass jeder String den unsere Funktion überreicht bekommt mit einem '\0' aufhört, können wir ganz einfach beliebig lange Wörter überprüfen. Denn '\0' evaluiert zu false, jeder andere char zu true (behaupte ich jetzt mal).

    Dein Programm funst übrigens nicht, weil du nach jedem Buchstaben -1 ausgibst, falls er nicht gepasst hat. Aber eigentlich soll doch nur -1 ausgeben werden, falls keiner der Buchstaben gepasst hat ( also am Ende).

    Und dann wären wir noch bei dem zweiten Problem, von dem alle reden: Wie schon gesagt, wenn du mit den C-Strings arbeitest musst du immer den '\0' hinten dran beachten. D.h. char wort[5] kann max. 4 Zeichen enthalten (das 5te ist "reserviert" für \0). Wenn du jetzt "hallo" in einen char[5] einlesen willst, dann schreibst du meines Wissens nach in Speicher, der theoretisch nicht vorgesehen ist. Das kann manchmal keine Auswirkung haben und manchmal in die Luft gehen.

    Eine bessere Größe wäre vielleicht etwas wie char wort[128] oder so. Angenommen der Benutzer gibt wirklich nur echte Wörter ein, wird das schon reichen.

    Dann sind wir beim nächsten Szenario, in die andere Richtung: Was wenn ich keinen Bock hab ein 4-char langes Wort einzugeben, und nur "Wo" eingebe. In der Funktion steht trotzdem noch i < 5, obwohl doch nur 2 Buchstaben im Wort sind. Theoretisch schauen wir uns also irgendeinen Müll an (denn wort[3] und wort[4] haben wir ja offiziell nicht beschrieben), soweit zumindest mein Verständnis. Kann mal nix passieren, kann mal in die Luft gehen. Fakt ist: Korrekt ist es nicht.

    Oder halt gleich std::string, wenns schon C++ sein darf...

    Von der Loop in main() will ich jetzt mal garnicht reden.

    Ich hab versucht nach bestem Wissen und Gewissen hier zu helfen. Falls mein Fachwissen an Stellen inkorrekt war, wäre ich sehr dankbar wenn jemand mich recht stellt.

    LG



  • find oder find_first_of (oder strchr)
    Alles andere ist Quatsch wenn man nicht mit C-Strings umgehen kann.


Log in to reply