Alternative zu strlen
-
Ich habe folgendes Problem. Ich habe char-Arrays, die am Ende auch mit Nullen aufhören können. Wenn sie mit Nullen aufhören dann nimmt strlen diese Nullen als Ende des Arrays und gibt mir dem entsprechend nicht die korrekte Länge zurück.
Gibt es noch eine andere Möglichkeit die Länge eines char-Arrays rauszubekommen, die auch die nullen berücksichtigt?
-
nein. wenn du die daten irgendwo ausliest kriegst du auch die länge dazu.
-
Was für Nullen denn genau? Die '0' hat afaik den ASCII-Code 48.
Ist dein C-String etwa so aufgebaut?'H', 'A', 'L', 'L', 'O', '\0', '\0', '\0' 0 1 2 3 4 5 6 7
Wenn ja, musst du dir afaik eine eigene Funktion schreiben, wobei ich mich gerade frage, wie man sowas nur benötigen kann.
Caipi
-
Benutz std::string oder merk dir die Größe.
-
Der Array wird von einer Methode zurückgegeben. In dieser Methode ist die Länge bekannt.
In der anderen Methode, die den Array weiterverwendet ist die Länge ja nicht bekannt und ich muss sie wieder herausfinden. Die Andere Methode kann ihn ja nicht auch noch zurückgeben, weil ja immer nur ein Wert zurückgegeben werden kann.
Die einzige Möglich die mir jetzt einfällt wäre eine zusätzliche Member-Variable auf die beide Zugriff haben. Aber das will ich eigentlich vermeiden.
-
Du kannst die Länge doch auch per Argument an die zweite Methode übergeben
//Edit:
Beispiel:
// Funktionen komplett ohne Return-Wert void method2(int v[], const unsigned int S) { // Hier weiter mit den Parametern arbeiten } void method1() { const unsigned int SIZE = 10; int arr[SIZE]; // irgendetwas mit arr machen. method2(arr, SIZE); }
Oder sehe ich da was falsch?
Caipi
-
du übergibst die länge einfach der methode die sie brauch und gut ist.
-
Ich kann sie aber nicht direkt übergeben. Da die Methode in der die Länge bekannt ist ja bereits den Array zurückgibt und demnach keinen anderern Wert mehr zurückgeben kann.
-
Klingt nach schlechtem Design
Ändernoder irgendwelche obstrusen Hilfskonstruktionen bauen.
-
Chew-Z schrieb:
Klingt nach schlechtem Design
Ändernoder irgendwelche obstrusen Hilfskonstruktionen bauen.
Das Problem ist das ich mit DIESEM schlechten Design ein ANDERES noch schlechteres Design "ausbessere".
Deswegen bleibe ich jetzt bei meiner "obstrusen Hilfskonstruktion", die ich gerade geschrieben habe.
-
Wenn du von beidem den Quellcode hast, warum kannst du dann keine Änderungen an
der "Wurzel des Übels" machen.
-
Ich bin an der Wurzel. Zwei zusätzliche Variablen und eine Zusatliche Verzweigung sind auf jedenfall das kleinere Übel.
-
Du kannst die Änderung der Funktion, d.h. den zusätzlichen Parameter für die
Rückgabe der Länge doch als Default-Parameter einfügen oder auch ne überladene
Funktion verwenden. Das heisst, der restliche Code bleibt unberührt. Was willst
du mehr.
-
Ich kann doch aber keine zwei Werte auf einmal zurückgeben.
Die erste Methode gibt den char-Array zurück.
Die zweite Methode braucht den char-Array UND die Länge des Arrays, die aber nur in der ersten Methode bekannt ist.
Was ich gemacht habe ist, dass die erste Methode die Länge des Arrays jetzt in eine zusätzliche private Membervariable schreibt, von der die zweite Methode dann die Länge liest.
-
Reden wir aneinander vorbei oder liest du die Posts nicht richtig? Soweit ich dich verstanden habe, hast du eine Methode, in der du ein Array und die Länge des Arrays definierst. Nun rufst du eine zweite Methode auf, die mit dem (nur) in der ersten Methode bekanntem Array und der Länge arbeiten soll. Nun verstehe ich nicht ganz, warum du nicht z.B. die Länge per Argument an die zweite Funktion übergibst (Von mir aus kannst du ja dein Array per Return wert übergeben)?
Falls du von Parameterübergabe im allgemeinen und/oder von ihren verschiedenen Spezifizierungen (Call by Reference, etc.) noch nicht so viel gehört haben solltest, siehe hier und/oder in verschiedenen Tutorials.
Caipi
-
Vielleicht reden wir aneinander vorbei.
Ich dachte an sowas:
char* getArray(&long laenge);
In laenge lieferst du halt zusätzlich die Länge des Array mit zurück !?!
Deine Funktion hat gewissermassen zwei Rückgabewerte. Wo ist das Problem.
-
Caipi schrieb:
Reden wir aneinander vorbei oder liest du die Posts nicht richtig? Soweit ich dich verstanden habe, hast du eine Methode, in der du ein Array und die Länge des Arrays definierst. Nun rufst du eine zweite Methode auf, die mit dem (nur) in der ersten Methode bekanntem Array und der Länge arbeiten soll. Nun verstehe ich nicht ganz, warum du nicht z.B. die Länge per Argument an die zweite Funktion übergibst (Von mir aus kannst du ja dein Array per Return wert übergeben)?
Falls du von Parameterübergabe im allgemeinen und/oder von ihren verschiedenen Spezifizierungen (Call by Reference, etc.) noch nicht so viel gehört haben solltest, siehe hier und/oder in verschiedenen Tutorials.
Caipi
Also:
Die eine Methode gibt den Array, der erst in dieser Methode "gemacht" wird an die andere Methode zurück.
Das heißt die andere Methode hat den Array aber NICHT dessen Länge.Auf der Seite zu der du den Link geschrieben hast heißt es wortwörlich:
Es kann nur Einen (Rückgabewert) geben!
Und genau daß ist das Problem. Ich müsste ZWEI Werte zurückgeben.
-
-=[P0I]=- schrieb:
Auf der Seite zu der du den Link geschrieben hast heißt es wortwörlich:
Es kann nur Einen (Rückgabewert) geben!
Stimmt, nur hättest du dir vielleicht den Abschnitt darunter ebenfalls durchlesen sollen, in dem detailiert steht, was hier die anderen verzweifelt versuchen zu vermitteln.
Funktion A ruft Funktion B auf, welches sowohl die Lange als auch das Array kennt. Der Funktion B wird eine Referenz als Parameter mitgegeben. Funktion B gibt das Array als Rückgabewert zurück und schreibt die Länge des Arrays in die Referenz. Somit weis auch Funktion A die Länge.
Andere Möglichkeit: du gibst keinen Zeiger auf das Array zurück, sondern ein struct, in dem sowohl der Zeiger als auch die Länge drin sind.
struct param { char *array; int length; } param getArray(void) { }
-
Ich hätte vielleicht sagen sollen dass eigentlich keine Methoden sind sondern Operatoren. Sorry.
Der +-Operator gibt einen char-Array zurück. Und es gibt einen =-Operator der einen char-Array als Parameter hat. Wenn jetzt sowas kommt wie
a = b + c;
wird eben zuerst der +-Operator benutzt und dann der =-Operator mit dem vom +-Operator zurückgegebenen char-Array, was zur Folge hat das "Funktion B" eben nicht von "Funktion A" aufgerufen wird.
-
Aha
Was mir dazu auf die Schnelle einfällt ist, dass du wie bereits von Killing me softly angedeutet, eine Struktur zurückgibst, die das Array und die Länge beinhaltet.Beispiel:
// Struktur kopiert aus Killing me softly's post :-) struct param { char *array; int length; }; // Gibt eine Struktur vom Typ param zurück. param operator+(const param& p1, const param& p2) { param tmp; // Dorthin werden p1 und p2 geschrieben. // Hier verbindest bzw. addierst du p1 und p2 nach // deinen kriterien; return tmp; }
Andernfalls verstehe ich nicht ganz, was so schwer daran ist, std::string zu verwenden oder aber sich eine Funktion zu basteln, die die Länge (nach deinen Kriterien) zurückgibt (wenn strlen() dir nicht gut genug ist).
Caipi
-
Da meine aktuelle Lösung beim überladenen +-Operator auserhalb der Klasse versagt, werde ich wohl doch eine Struktur (oder eine Klasse) zurückgeben.
Danke an alle die mir mehr oder weniger geholfen haben.