Funktion soll Dateiendung (eigntl. String) ausgeben und eine weitere Frage zu Strings



  • Hallo zusammen,

    ich bin Anfänger in C++ und versuche mich gerade an ein paar Aufgaben, die wie folgt lautet:

    Die Funktion leftstr() soll erhält einen String und eine ganze Zahl als paramter. Sie liefert einen String als Rückgabewert, der die Anzahl der Zeichen des Quellstrings enthält, die als parameter angegeben wurden. Ist der Quellstring kleiner als die zu extrahierende Zeichenzahl, dann soll der ganze Quellstring geliefert werden.

    Die Funktion endung() soll einen String als Parameter erhalten. Wenn dieser parameter einen Punkt enthält, dann sollen alle Zeichen nach dem Punkt wieder ausgegeben werden. Ist kein Punkt im Parameter, dann soll ein leerer String zurück gegeben werden.

    Gut, als nächstes mal meinen Code:

    #include <iostream>
    #include <cstdlib>
    #include <string>
    
    using namespace std;
    
    string klein (string a);
    string gross (string a);
    int strhaeufig(string a, char b);
    string leftstr(string a, int b);
    string rightstr(string a, int b);
    string endung (string a);
    
    int main() {
    
    string eingabe;
    string test;
    char haeufig;
    int anzahl;
    
    cout<<"String eingeben: ";
    getline(cin, eingabe);
    
    	test=klein(eingabe);
    	cout<<endl<<test<<endl;
    	test=gross(eingabe);
    	cout<<endl<<test<<endl;
    
    	cout<<"Haeufigkeit eines Zeichens. Bitte Zeichen eingeben: ";
    	cin>>haeufig;
    	cout<<"Das eingebene Zeichen wurde "<<strhaeufig(eingabe, haeufig)<<" mal gefunden."<<endl;
    
    	cout<<"Funktion leftstr"<<endl<<"Anzahl der wieder auszugebenden Zeichen des Strings angeben: ";
    	cin>>anzahl;
    	test=leftstr(eingabe, anzahl);
    	cout<<test<<endl; //Es erfolgt keine Ausgabe???
    
    	cout<<"Funktion rightstr"<<endl<<"Anzahl der zu extrahierenden Zeichen am Ende des String eingeben: ";
    	cin>>anzahl;
    	cin.ignore();
    	cout<<rightstr(eingabe, anzahl)<<endl;
    
    	cout<<"Funktion endung"<<endl<<"Dateinamen eingeben: ";
    	getline(cin, test);
    	test=endung(test);
    	cout<<"Die Dateiendung lautet: "<<test<<endl;
    
    system("pause");	
    }
    
    string klein (string a) {
    	for (int i=0; i<a.length(); i++) {
    		a[i] = tolower(a[i]);
    	}
    	 return a;
    }
    
    string gross (string a) {
    
    	for (int i=0; i<a.length(); i++) {
    		a[i] = toupper(a[i]);
    	}
    	return a;
    }
    
    int strhaeufig(string a, char b) {  // Bei dieser Funktion wird zw. Gross- und Kleinschreibung unterschieden. Soll dem nicht so sein muss noch tolower oder toupper hinzugefügt werden
    	int anzahl = 0;	
    		for (int i=0; i<a.length(); i++) {
    			if (a[i]==b) {anzahl = anzahl +1;}
    		}
    		return anzahl;
    }
    
    string leftstr(string a, int b) {
    	string rueckgabe= "blubb"; //Warum reicht es nicht den String deklarieren, denn wenn ich nur string rueckgabe; schreibe, bekomme ich keine Ausgabe?
    	//string rueckgabe;		//Damit bekomme ich keine Ausgabe??
    	if (a.length() < b) {
    		return a;
    	}
    	else {
    		for (int i=0; i<= b; i++) {
    		rueckgabe[i] = a[i];
    		}
    		return rueckgabe;
    	}
    }
    
    string rightstr (string a, int b) {
    	string rueckgabe="blubb"; //test wegen gleicher Frage bei der Funktion leftstr
    	if (a.length() < b) {
    			return a;
    		}
    	else {
    			for (int j=0, i=a.length() - b; i<=a.length(); i++) {
    				rueckgabe [j] = a[i];
    				j++;
    			}
    			return rueckgabe;
    	}
    }
    
    string endung (string a) {
    	bool hatPunkt = false;
    	string rueckgabe=""; //hier mal zu Testzwecken als leerer String, //aber funktioniert auch nicht
    
    	//Prüfen, ob Punkt in String
    	for (int i=0; i<=a.length(); i++) {
    		if (a[i]=='.') {hatPunkt = true;}
    	}
    
    	if (hatPunkt == true) {
    		int stellePunkt;
    		//Feldnummer mit Punkt finden und stellePunkt zuweisen
    		for (int i=0; i<=a.length(); i++) {
    			if (a[i]=='.') {stellePunkt=i;}	
    		}	
    		//Ab dem Punkt in String: Inhalt in String rueckgabe kopieren
    		//cout<<"stellePunkt: "<<stellePunkt;
    		for (int i = stellePunkt +1, j=0 ; i<=a.length(); i++) {
    			rueckgabe[j] = a[i];
    			j++;
    		}
    		return rueckgabe;
    	}
    	else {return "";}
    }
    

    Nun meine Fragen:
    Zu der Funktion leftstr (bzw. im Code auch zutreffend auf rightstr):
    Warum kann ich nicht einfach nur einen String deklarieren? Wenn ich einfach nur string rueckgabe; schreibe, bekomme ich überhaupt keine Rückgabe. Nur wenn ich dem String noch etwas zuweise (im Code "blubb"), dann bekomme ich eine Rückgabe. Das Ergebnis sieht aber dann nicht so aus, wie gewollt.

    Außerdem zu der Funktion endung:
    Auch hier habe ich das gleiche Problem wie gerade bei leftstr beschrieben.

    Eigentlich hätte ich gerne einen leeren String in jeder Funktion, in welchen dann das Ergebnis der Schleifen usw. rein geschrieben werden.

    Ich steh grad auf dem Schlauch und wäre für Hilfe sehr dankbar!

    Danke!



  • Duff991 schrieb:

    Warum kann ich nicht einfach nur einen String deklarieren? Wenn ich einfach nur string rueckgabe; schreibe, bekomme ich überhaupt keine Rückgabe. Nur wenn ich dem String noch etwas zuweise (im Code "blubb"), dann bekomme ich eine Rückgabe. Das Ergebnis sieht aber dann nicht so aus, wie gewollt.

    Weil du dann nur einen leeren String hast und in diesen kannst du mit operator[] nicht einfach was reinschreiben. Du musst den string vorher auf die richtige Größe vergrößern mit resize oder alternativ mit push_back Werte hinten anhängen.


Anmelden zum Antworten