Anzahl eines Buchstabens in einem String



  • Hi,

    ich soll eine Funktion schreiben, welche die Anzahl eines bestimmten Buchstabens in einem Wort wiedergibt. Ich habe bisher folgendes erreichen können:

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    int countchar(char *str, char c);
    
    int countchar(char *str, char c) {
    
    int z, i;
    
    z = 0;
    
    int len = strlen(str);
    
    	for (i = 0; i <= len; i++) {
    
    		if (str[i] == c) {
    
    			z = z+1;
    
    		}
    
    	}
    
    	return z;
    
    };
    
    int main () {
    
    char *str;
    char c;
    int z;
    
    	cout << "Geben Sie bitte das Wort ein" << endl;
    
    	cin >> str;
    
    	cout << "Welcher Buchstabe soll gesucht werden?" << endl;
    
    	cin >> c;
    
    		z = countchar(str, c);
    
    	cout << "Der Buchstabe kommt in dem Wort " << z << " mal vor" << endl;
    
    }
    

    Den Fehler, den ich nun beim Ausführen nach Eingabe des Wortes bekomme, ist (Das Kompilieren funktioniert problemlos):

    Segmentation Fault: 11

    Nach meinen Google Ergebnissen scheint das ein sehr häufiger Fehler im Zusammenhang mit Pointern zu sein, mir ist allerdings nicht klar geworden, wo er bei mir liegt.

    Ich würde mich freuen, wenn mir jemand von euch helfen kann!

    Gruß



  • Die schnelle Lösung: statt char* str in main char str[1024]

    die sinnvolle Lösung: benutze std::string. Immer!



  • str ist ein Zeiger, er zeigt ins Nirvana in den es das Programm schickt
    sobald da Werte reingeschrieben werden ...

    char str[vielplatz] anstelle *str sollte helfen.



  • Bei mir funktioniert der Code. Ich würde jedoch vll. folgendes umändern:
    Statt:

    for (i = 0; i <= len; i++) {
    

    würde ich:

    for (i = 0; i < len; i++) {
    

    Da es sich beim letzten Zeichen sich um das Terminierungsbit handelt, braucht es nicht mit einem Zeichen zu vergleichen.



  • LEARNcpp schrieb:

    Bei mir funktioniert der Code.

    Mutig 🕶



  • Scheppertreiber schrieb:

    LEARNcpp schrieb:

    Bei mir funktioniert der Code.

    Mutig 🕶

    😃 Habs kapiert ^^ wusste das jezt sowas kommt...



  • Vielen Dank euch allen für die vielen schnellen Antworten. Jetzt läuft das Programm!



  • das hier läuft??

    char * str;
    cin >> str;
    

    dann hast du aber verdammtes glück. vielleicht solltest du bei dem glück was lotto spielen, so kommst du gut an geld...

    ne mal spass beiseite: wie einer der vorredner schon gesagt hat, zeigt der pointer randommässig in den speicher, und dahin versuchst du mit cin dann zu schreiben. das wird früher oder später die erdachse kippen und die sonne implodieren lassen

    guck dir mal std::string an, oder wenn du echt low level auf C-ebene bleiben willst, dann guck dir (dynamische) speicherverwaltung und c-strings an



  • wdposchmann schrieb:

    char *str;
    cin >> str;
    

    Den Fehler, den ich nun beim Ausführen nach Eingabe des Wortes bekomme, ist (Das Kompilieren funktioniert problemlos):

    Segmentation Fault: 11

    Nach meinen Google Ergebnissen scheint das ein sehr häufiger Fehler im Zusammenhang mit Pointern zu sein, mir ist allerdings nicht klar geworden, wo er bei mir liegt.

    Der Zeiger str wurde nirgens initialisiert. Bei cin>>str wird auch nicht extra Speicher angefordert und der Zeiger entsprechend modifiziert, dass er auf diesen neuen Speicherbereich zeigt. Der Operator geht davon aus, dass der Zeiger schon auf einen gültigen, vorher reservierten Speicherbereich zeigt.

    Allerdings ist dieser Operator (in Verwendung mit char* auf der rechten Seite) eh gefährlich, da die Funktion, die dahinter steckt, gar nicht weiß, wieviel Platz überhaupt benutzt werden darf. Ist der reservierte Speicher zu klein, fliegt dir das dann wieder um die Ohren. Im besten Fall bekommst Du wieder einen solchen Speicherzugriffsfehler und das Betriebssystem killt Dein Programm. Im schlechten Fall, läuft den Programm weiter, produziert Müll oder kackt irgendwo anders unerklärlich ab, weil irgendwas nicht stimmt und du in Freispeicherbereiche geschrieben hast, wo Du nichts drin verloren hast.

    Der Typ char* ist für Adressvariablen (Zeiger), nicht für Stringvariablen. Wenn Du eine Variable möchtest, die Strings statt Adressen (auf wer weiß was) speichert, dann ist std::string der richtige Typ für diese Anwendung. Dazu inkludierst Du dann noch <string>. Du kannst natürlich ach manuell Speicher verwalten und Dir die entsprechenden Adressen über Zeiger merken. Das ist aber nicht im Sinne von C++ und der Kapselung, die Dir C++ für ein angenehmeres Programmieren erlaubt.



  • Vermutlich wieder eine Aufgabenstellung der Kategorie "C mit Klassen".
    In C++ kann man das so lösen:

    #include <iostream>
    #include <string>
    #include <limit>
    #include <algorithm>
    
    int main()
    {
       char Letter = 0;
       std::string Input;
    
       std::cout << "Bitte geben Sie das Wort ein: " 
       std::cin >> Input;
    
       // Fallstrick:
       // Wenn ein Leerzeichen im Wort vorhanden ist wird nur bis zum Leerzeichen
       // aus std::cin gelesen, die übrigen Buchstaben verbleiben im Eingabepuffer
       // und würden beim nächsten Einlesen gelesen. Daher den Rest der Eingabe 
       // bis zum CR verwerfen
       std::cin.ignore( std::numeric_limits<int>::max(), '\n' );
    
       std::cout << "Bitte geben Sie den zu suchenden Buchstaben ein: ";
       std::cin >> Letter;
    
       std::size_t Count = count( Input.begin(), Input.end(), Letter );
       std::cout << "Der Buchstabe " << Letter << " kommt im Wort " << Input 
                 << " " << Count << "x vor." << endl;
    }
    


  • DocShoe schrieb:

    // Fallstrick:
       // Wenn ein Leerzeichen im Wort vorhanden ist wird nur bis zum Leerzeichen
       // aus std::cin gelesen, die übrigen Buchstaben verbleiben im Eingabepuffer
       // und würden beim nächsten Einlesen gelesen. Daher den Rest der Eingabe 
       // bis zum CR verwerfen
    

    Deshalb gibt es std::getline .



  • Ja, aber dann hast du die ganze Zeile. Die Aufgabenstellung war doch Wort, oder irre ich mich da?


Anmelden zum Antworten