Was ist falsch? Rückgabewert char /Funktion
-
#include <conio.h> //getch(); #include <iostream> using namespace std; char binde(char[15],char[5]); //Deklaration der Funktion int main() { char name[15],endung[5],dateiname[20]; cout<<"Name der Datei?"<<endl; //Eingabe zB.: testH.tsH cin.get(name,15,'.'); //testH cin.get(endung,5,'\n'); //.tsH dateiname[20]=binde(name,endung); cout<<"Dateiname nach der Funktion:"<<dateiname<<endl; //nicht test.ts <--Fehler getch(); return 0; } char binde (char a[15], char b[5]) { char erg[20]; int lauf=0; while(a[lauf]!='H') //eigentlich sollte die Schleife bei '\n' aufhören, aber da kommt ein Fehler { erg[lauf]=a[lauf]; lauf++; } int lauf2=0; while(b[lauf2]!='H') //eigentlich sollte die Schleife bei '\n' aufhören, aber da kommt ein Fehler { erg[lauf]=b[lauf2]; lauf++; lauf2++; } cout<<"Dateiname in der Funktion:"<<erg<<endl; //test.ts <-- ist noch OK return (erg[20]); }Ich möchte das der benutzer einen Dateinamen eingibt, und ich dann, je nach Endung reagieren kann.
Da ich ja name und endung getrennt habe möchte ich sie wieder zusammenfügen um die Datei zu öffnen. Und das ganze mit der Funktion binde, die auch nicht so 100pro funktioniert... noch nicht...wenn ich aus
return(erg[20]);return(erg[]);mache bringt mir der Compiler einen fehler, kann mir wer weiter helfen?
-
Deine Funktion gibt char zurück. char ist ein Zeichen. Da du keine Arrays zurückgeben kannst, und Zeiger nicht zurückgeben solltest, könntest du beispielsweise ein Zielarray als zusätzlichen Parameter übergeben, oder ein Array in eine Struktur packen und eine solche zurückgeben.
-
Gustl schrieb:
Hi, was ist an dem Code falsch?
Vielleicht solltest du nochmal die anderen Threads von dir durchstöbern und auf den Rat hören dich mit std::string vertraut zu machen (<string>; Sowie ein Buch wie C++ Primer oder ähnliches verwenden).
Wenn du den masochistisch veranlagt bist und unbedingt mit char,char[] und char* hantieren willst, solltest du dich insbesondere mit Arrays (und Indexgrenzen) sowie etwas mit Zeigerarithmetik und der C-Bibliothek (unter C++ insbesondere mit <cstring>) auseinander setzen. Das ist aber eher eine C als eine C++ Problematik.
Des weiteren sind Strings in der Regel 0-Terminiert (Also nicht '\n' sondern '\0').
cu André
-
Gustl schrieb:
Ich möchte das der benutzer einen Dateinamen eingibt, und ich dann, je nach Endung reagieren kann.
Mein Tip nimm den boost::tokenizer und arbeite mit std::string.
-
Alles klar, danke euch, stimmt das war ja \0 und nicht \n.
Ich werde probieren den Rückgabewert mit einer Struktur zurück zu geben, allerdings habe ich das auch noch nicht gemacht, muss ich mich mal einlesen...
boost::tokenizer habe ich im internet nichts gefunden was ich verstehen könnte. Aber danke.
MfG
-
Ich hatte nicht bemerkt, dass das das C++-Forum ist.
Gustl schrieb:
Ich werde probieren den Rückgabewert mit einer Struktur zurück zu geben, allerdings habe ich das auch noch nicht gemacht, muss ich mich mal einlesen...
Tu dir selbst einen Gefallen, und benutz std::string.
-
Gustl schrieb:
Ich werde probieren den Rückgabewert mit einer Struktur zurück zu geben, allerdings habe ich das auch noch nicht gemacht, muss ich mich mal einlesen...
Darf ich dich mal fragen warum du so fehement an dem C-String festhalten willst, und nun auch noch Umwege über Strukturen suchst?
Den tokenizer halte ich in diesem Fall zwar für die Extremlösung (zumal der '.' im Dateinamen unter Windows erlaubt ist, und nur der letzte Punkt die Dateiendung markiert. So wäre "a.b.txt" ein gültiger Dateiname).
Zu Boost wäre die Seite www.boost.org der richtige Anlaufpunkt, auch wenn die Boostbeschreibung teilweise wirklich schwer verständlich ist, finde ich die Beispiele vom tokenizer noch recht verständlich.
Wenn du am Englisch scheiterst musst du (das ist jetzt nicht böse gemeint) dich anstrengen, den Programmierung ohne Englisch ist eigentlich unmöglich. Das sagt dir einer, der sich in Englisch nur mit Händen und Füßen verständigen, aber dank Übung wenigstens Fachliteratur lesen kann - und hier führt kein Weg am Englischen vorbei (Das was es in deutsch gibt, ist nur der "Bodensatz", meist schon etwas veraltet wenn es erscheint...).
Um dir aber mal weiterzuhelfen (Wobei ich hier keinen Fehlerfall etc. prüfe):
#include<iostream> #include<string> int main() { std::cout << "Name der Datei?" << std::endl; std::string eingabe; std::cin >> eingabe; std::string endung = eingabe.substr(eingabe.rfind(".")+1); std::string dateiname = eingabe.substr(0, eingabe.rfind(".")); std::string gesamt = dateiname + "." + endung; std::cout << endung << std::endl; std::cout << dateiname << std::endl; std::cout << gesamt << std::endl; return 0; }string::substr liefert einen Teilstring zurück, beginnend mit der Position die als Parameter 1 übergeben wird (Bedenke das die Indexierung mit 0 beginnt), die Anzahl der Zeichen wird mit dem zweiten Parameter angegeben (Wenn nichts angegeben wird der gesamte Reststring zurückgeliefert). string::rfind sucht im String von Hinten an das angegebene Zeichen (als Zweiten Parameter, hier unwichtig wäre die Startposition [Default=Stringende] anzugeben).
Die Endung erhalten wir, in dem wir ein Zeichen nach dem "." anfangen (den Zweiten Parameter benötigen wir nicht, da wir alles bis zum Ende suchen). Beim Dateinamen schneiden wir alles beginnend mit dem Treffer ab. In diesen Fall müssen wir eins vor dem Zeichen aufhören (Da rfind die Position [beginnend mit 0] ausgibt, klappt dies aber auch ohne Subtraktion, da die Position der Anzahl der Zeichen einschließlich "." - 1 entspricht).
cu André
-
Gut beschrieben, und so das ich es auch verstanden habe, danke.

Ja das mit dem Englisch ist so eine Sache, mein letztes Englisch hatte ich in der Berufsschule, und das kann man gleichstellen mit dem englisch dem man in der technikerschule lernt (wo ich gerade bin)... aber da muss ich wohl durch und mich auf solchen seiten mal durchbeißen.
Gibt es eine auflistung auch in deutsch der ganzen string funktionen?
Noch eine Frage, ist dasstd::wirklich nötig?
Hängt das mit demusing namespace std;zusammen?
-
Gibt es eine auflistung auch in deutsch der ganzen string funktionen?
Mir ist keine deutsche Dokumentation der C++ Standard Library bekannt.
Noch eine Frage, ist das
std::wirklich nötig?
Hängt das mit dem
using namespace std;zusammen?
std ist der namespace. In Namespaces befinden sich Funktionen und Typen befinden. Es ist eine logische Unterteilung.
Der Sinn von Namespaces ist es, Nameskollisionen zu verhindern.Wenn Du jetzt z.B. die Klasse string aus dem Namespace std benutzen möchtest gibts drei Möglichkeiten.
1.) Voll qualifizierter Name verwenden
std::string
2.) Die Klasse string aus dem std Namespace mit using std::string; bekannt machen
3.) Alle Typen aus dem std Namespace mit using namespace std; bekannt machenAber: Die using Möglichkeiten machen den eigentlich Sinn von Namespaces zunichte. Deshalb sollte in Headern immer der voll qualifizierte Name verwendet werden (
Keine using Direktiven in Headern!)Simon
-
Gustl schrieb:
...aber da muss ich wohl durch und mich auf solchen seiten mal durchbeißen...
Leider gibt es zu bestimmten Quellen keine wirklichen Alternativen.
Ich habe eine Hand voll deutscher Bücher zum Thema Standardbibliothek gefunden, kann dir aber nicht sagen wie sie sind, Nachfolgend die Link auf die entsprechenden Amazonseiten:
Die C++-Standardbibliothek. Einführung und Nachschlagewerk
STL kurz und gutGustl schrieb:
Noch eine Frage, ist das
std::wirklich nötig?
Hängt das mit demusing namespace std;zusammen?
Jein und Ja. Letzteres macht den Namensraum std sichtbar so das man das std:: nicht schreiben muss. Aber mehr zum ersten Punkt:
Ja, es gibt bestimmte Bereiche in denen man tunlichst nicht "using namespace" verwenden sollte. So z.B. in allen Dateien die includiert werden (den dann macht man den Namensraum global bekannt, was den Sinn der Namensräume zunichte macht. Und Fehler aufgrund von Mehrdeutigkeiten sind unschön wenn man dann nachträglich jedesmal überlegen muss zu welchen Namensraum was führt).
Dies ist z.B. in den Komponenten des C++ Builders so betrieben wurden (Am Ende eines Headers steht immer using namespace), was mir einige Stunden Fehlersuche und Problembehebung einbrachte.
Nein, nötig ist es in anderen Situationen auch nicht zwangsläufig. Solange du das using namespace in Dateien verwendest die nicht inkludiert werden (und bitte nach allen includes), kannst du auch using namespace verwenden.
Grundsätzlich gilt bei using namespace das gleiche wie bei Variablen: So lokal wie möglich (Du kannst es auch in den Funktionsrumpf setzen).
Warum schreibe ich hier also das std:: aus?
a) Damit du siehst was zur Standardbibliothek gehört
b) Weil ich es gewohnt bin, da spätestens bei gleichen Namen in mehreren Bibliotheken es ohnehin nötig wird.Ich verwende zwar using namespace, aber nur selten und auch nur sehr lokal.
cu André