Brauche dringendst Hilfe bei C!

  • Thread starter Thread starter server4downs
  • Start date Start date
S

server4downs

Guest
Hallo zusammen,

wie der Titel schon aussagt habe ich ein Problem mit der Progger-Sprache C.
Ich muss hier irgendwie eine Variable aufspalten...
In PHP geht das ja recht leicht.. nur C kann ich leider nicht wirklich.
path = "/path/to/home/xxx/1/234/3456/dir/beer.php";
So, nun ist path halt variabel, d.h. die ersten 3 Ordner bleiben gleich, der 4. Ordner ist variable und der Rest kann länger oder kürzer sein.
In PHP würde ich das jetzt einfach mit explode machen.
In C bin ich ratlos.
Als Ergebnis brauche ich:
path = "/path/to/home/xxx/";
Wobei xxx nicht bestimmt ist. Denn ansonsten bräuchte ich ja gar nichts aufsplitten und könnte gleich
path = "/path/to/home/folderx/";
nehmen. Alles verstanden?
Also, um es noch deutlicher zu machen:
path = "/path/to/home/xxx/1/234/3456/dir/beer.php"; ist ein Pfad zu einer Datei, der mir automatisch übergeben wird. Nun muss ich eben von diesem Path den Document_Root rausfischen. Der Doc_Root ist eben /path/to/home/userid/.

Bitte um Hilfe!
 
Mag mich denn hier keine mehr?
Oder muss ich erst wieder irgendwelche HowTos posten damit mir wieder geholfen wird? ;)
Naja, schade Banane.
 
Wenn ich dich richtig verstanden habe hast du "/path/to/home/", "1/234/3456/dir/beer.php" und "xxx" und willst daraus "/path/to/home/xxx/1/234/3456/dir/beer.php" machen.

Oder willst du das ganze umgekehrt machen?

um das ganze auszugeben machst du dann einfach printf("%s%s%s", var1, var2, var3); Die selbe Syntax funktioniert auch zum String zusammensetzen nur bin ich jetzt zu müde um die C Funktion dafür im Buch nachzuschlagen.

Für umgekehrt suchst du dir die richtige Stelle, mit einer for-Schleife oder so und machst einen Stringcopy in eine neue Variable mit &var1[position].
& steht dabei für die Adresse und die Eckigenklammer für den Index im Array.

Sonst noch Fragen? Wenn es nicht klappt schreib nochmal oder mache eine PM dann schreibe ich dir die genau Funktion haarklein auf.
 
Hey, Danke, dass du es wenigstens probierst mir zu helfen!
Also, ich habe mich da glaube ich etwas unlogisch ausgedrückt.
Ich muss den Document_Root von einem Pfad rauskriegen.
Mir wird nur der gesamte Pfad als Variable übergeben. Der Document_Root befindet sich jedoch in diesem Pfad.
Bei PHP mach ich das einfach mit explode() oder split() oder so was. Da trenn ich dann einfach alles in ein array auf mit "/". Und dann klatsch ich die ersten 3 oder 4 Teile des Arrays zusammen und hab somit den Document_Root raus.
Verstanden worauf ich hinaus will?
Wenn nein, dann:
Beispiel:
User Peter ruft sein Script
/this/is/his/docroot/54342/testdir1/dir2/boring.php
auf. Dies steht mir in einem C-Script als Variable zur Verfügung. Damit kann ich jedoch nicht viel anfangen, denn ich brauche nur seinen Document_Root, also
/this/is/his/docroot/Peter/
Dürfte doch rein theoretisch nicht so schwer zu realisieren sein, oder?
Muss man die Variable irgendwie mit einer Schleife durchlaufen oder wie macht man das?

P.S.:
Wenn ihr mir hier erfolgreich helfen könnt, so werdet natürlich auch ihr in Form eines funktionstüchtigen "PHP4 and PHP5 compiled together as CGI - Patched" - HowTo belohnt ;)
 
Last edited by a moderator:
Da ich jetzt nicht noch mit includes und allem dem dich verwirren will schreiben ich dir eine kurze Stringcopy-Funktion selbst. Wenn du dir die anguckst lernst du auch was über C und seine Mächtigkeit.

Code:
void stringcopy(char *Ziel, char *Quelle)
{
    for(int i = 0; Quelle[i]; i++)
    {
        Ziel[i] = Quelle[i];
    }
}

int main (int argc, char * const argv[]) {
    int Zaehler = 0;
    char string1[128];
    char string2[128];
    for(int i = 0; string1[i]; i++)
	{
		if(string1[i] == '/')
			Zaehler++;
		if(Zaehler == 6)
		{
			string1[i+1] = 0;
			stringcopy(string2, string1);
			break;
		}
	}
		
	return 0;
}

Vorrausgesetzt in String1 wäre etwas trin und es soll alles vor dem 6 / dann bist du damit fertig.

Beachte aber noch es ist keine Längenüberwachung eingebaut.
 
Last edited by a moderator:
Ja, danke. Hat soweit geklappt.
Was jedoch zu verbessern wäre, dass man die variable i nicht in der for-Schleife deklarieren sollte, da es sonst beim Compilen Ärger gibt.
Das Problem wäre somit schonmal gelöst. Jedoch will es noch nicht so, wie ich es will, obwohl dies nun nichtsmehr wirklich mit dieser Problematik am Hut hat.

Hat mir jemand vielleicht gerade einen Link zur Hand, wo ein bissle mehr über den internen Aufbau von PHP selbst etwas geschrieben steht. Ich wurschtel da gerade an open_basedir rum.
 
Welchen Compiler benutzt du das es Probleme gibt wenn i in der for-Schleife deklaeirt wird? Eine aus den 70ern?
 
Tobster said:
Welchen Compiler benutzt du das es Probleme gibt wenn i in der for-Schleife deklaeirt wird? Eine aus den 70ern?
gcc version 2.95.4 20011002 (Debian prerelease)
So veraltet bin ich dann doch nicht unterwegs ;)
 
Tobster said:
und wo liegt denn dann das Problem?
Wie gesagt. Gefällt ihm nicht. Genaue Fehlermeldung hab ich nicht parat. Ist aber genauso wie wenn man nicht deklariert hat.
Also.. blabla var i not defined.. first use in this function on line blabla... (ungefär). Ist aber auch völlig wurscht. Dann deklariert man diese eben eine Zeile drüber ;)
 
Hallo server4downs,

du solltest noch folgendes vor der for Schleife in der main Funktion setzen:

Code:
if(strlen(argv[0]) > 127)  return 1;

Sonst kann es unter Umständen zu einem Pufferüberlauf kommen.

Edit: Oder anstelle von argv[0], deine Variable in welcher dein Pfad gespeichert ist. Return 1, deshalb weil ein Programm welches ein Integer zurückgibt, normalerweise nur 0 zurückgibt, wenn alles in Ordnung ist.
 
Last edited by a moderator:
Back
Top