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.


  • Mod

    Du kannst dir den Umweg über t auch ganz sparen und direkt mit string arbeiten. Das ist schließlich nur eine lokale Kopie eines Zeigers und du kannst den beliebig verändern. Ebenso z/insert und position/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 hinter insert aber nicht. Daher wäre es gut, das durch ein const kenntlich zu machen -> void myStrChrInsertBeforePosition(char *s, int pos, const char *insert). Ebenso der string 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.


  • 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);
    }
    

Log in to reply