integer Zahl aus einer Funktion in mainfunktion einfügen
-
Hallo zusammen,
ich habe eine Funktion geschrieben die mir die Länge eines Strings bemisst. Nun brauche ich diese Länge in einer anderen Funktion. Wie muss ich das schreiben?
Also wie bekomme ich die Integer Zahl (Länge) aus einer Funktion in eine andere Funktion eingefügt?
Ich weis strlen() gibt's, aber will es ohne solche Funktionen schreiben.
Hier meine Funktion in der ich die Länge brauche:int myStrChrInsertBeforePosition(char *s, int pos, char *insert) { char *t = s; int position = pos; char *z = insert; int i = 0; int tlaenge = /*(int)Laenge(t)*/; // (int)Laenge(t) ist mein Versuch int zlaenge = /*(int)Laenge(z)*/; // Laenge ist meine Funktion zum Länge messen for (i = tlaenge + zlaenge; i >= position + zlaenge; i--) // Alle Zeichen nach der Einfügestelle werden ein nach hinten verschoben t[i] = t[i - zlaenge]; t[position] = z[0]; // Zeichen z einsetzen in String t an Position return 0; }
Und hier meine Funktion um die Länge zu messen:
int Laenge(char *string) { char *t = "string"; int i = 0; while (*t != 0) { i++; t++; } return 0; }
Danke schon mal im vorraus.
-
Okay, viel aufwand für nichts, sry, habe meinen Fehler gefunden.
Hab in meiner Längen Funktion string in Gänsefüße gesetzt.
-> Das korrigiert und dann noch den returnwert in zu i gemacht.
-
Du kannst dir den Umweg über
t
auch ganz sparen und direkt mitstring
arbeiten. Das ist schließlich nur eine lokale Kopie eines Zeigers und du kannst den beliebig verändern. Ebensoz
/insert
undposition
/pos
in deiner ersten Funktion.Andere Sachen:
- Man sollte normalerweise nur etwas zurück geben, wenn es auch irgendetwas bedeutet. Was bedeutet es, dass deine Funktionen 0 zurück geben? Nichts. Dann gib doch lieber nichts zurück (Rückgabetyp
void
). - Wo wir schon bei Veränderung von Werten sind: Normalerweise ist es ganz nett, den Nutzer einer Funktion wissen zu lassen, ob man einen Wert verändert oder nicht. Beispielsweise wird in deiner ersten Funktion das Objekt hinter
s
verändert, das Objekt hinterinsert
aber nicht. Daher wäre es gut, das durch einconst
kenntlich zu machen ->void myStrChrInsertBeforePosition(char *s, int pos, const char *insert)
. Ebenso derstring
in deiner zweiten Funktion. Das hat auch handfeste Vorteile, als das es dem Compiler solidere Diagnostik erlaubt, weil er erkennt, wenn du versehentlich an unveränderlichen Werten herum doktorst. - Deine erste Funktion ist wegen der komischen Variablennamen sehr schwer zu lesen (
z
,t
,s
: Hat das irgendeine tiefere Bedeutung? Nein, es macht nur, dass man beim Lesen die ganze Zeit zurück zur Definition springen muss, was was ist), aber ich bin mir 99% Sicher, dass das falsch ist. Da besteht vielleicht ein Zusammenhang mit schlechter Lesbarkeit.
- Man sollte normalerweise nur etwas zurück geben, wenn es auch irgendetwas bedeutet. Was bedeutet es, dass deine Funktionen 0 zurück geben? Nichts. Dann gib doch lieber nichts zurück (Rückgabetyp
-
Wie ich zuvor in einem anderen Thread schon schrieb, man muss mit
int
aufpassen, weil das zu Problemen führt. Das Programmbeispiel von Dir mit etwas Testcode drumherum.#include <stddef.h> #include <stdio.h> #include <stdlib.h> int Laenge(char* t) { int i = 0; while (*t != 0) { i++; t++; } return i; } int main () { char* s = 0; const size_t size = 4*1024l*1024l*1024l; s = malloc(size); for (size_t i = 0; i < size; ++i) { s[i] = 'A'; } s[size-1] = '\0'; int i = Laenge(s); printf("%zu\n", size-1); printf("%i\n", i); free(s); exit (EXIT_SUCCESS); }