Char Array nach dem 2.Wert teilen
-
Hallo Leute,
ich muss eine Client-Server Anwendung unter Linux schreiben. Über den Clienten muss man als erstes immer einen Request eingeben und danach was man halt möchte.
Z.b. GET pfad/datei
GET pfad/datei wird in ein Char-Array gespeichert und an den Server übergeben. Wie kann ich jetzt diesen Array nach dem Request(GET) zerteilen, damit ich mit pfad/datei auch etwas anfangen kann? Im großen und ganze möchte ich den 1.Parameter (Request) und den Rest in zwei verschieden char arrays zerteilen.
Vielen Dank im Vorraus
-
Ich glaube, du bist mit der Aufgabe, eine Client/Server-Anwendung zu entwickeln, komplett überfordert, wenn du noch nicht mal absoluten C Grundlagen wie einfachstes Stringhandling beherrscht.
-
Wutz schrieb:
Ich glaube, du bist mit der Aufgabe, eine Client/Server-Anwendung zu entwickeln, komplett überfordert, wenn du noch nicht mal absoluten C Grundlagen wie einfachstes Stringhandling beherrscht.
Deine Beiträge sind mir schon bei anderen Themen aufgefallen. Total niveaulos sowas. Hälts dich für den geilsten, was? Wenn man seit über einem Jahr nichts mit C zu tun hatte, und jetzt so eine Aufgabe machen muss, dann ist es normal,dass man sich wieder einfinden muss. Einfach reinkommen, wenn man eine Idee hat reinschreiben und den Dank vom Threadstarter bekommen. Ist das so schwer???
-
Wutz hat aber recht. Wenn du nicht weißt, wie du so etwas grundlegendes machst, dann baust du sehr wahrscheinlich alle möglichen Sicherheitslücken und Fehler in deinen Server ein. Gerade beim Umgang mit Strings kann man in C viel falsch machen.
Aber hier ist die Lösung
char request[] = "GET foo/bar"; char *path = request + 3; *path = '\0'; ++path; printf("Type %s\nPath %s\n", request, path);
-
rüdiger schrieb:
Wutz hat aber recht. Wenn du nicht weißt, wie du so etwas grundlegendes machst, dann baust du sehr wahrscheinlich alle möglichen Sicherheitslücken und Fehler in deinen Server ein. Gerade beim Umgang mit Strings kann man in C viel falsch machen.
Aber hier ist die Lösung
char request[] = "GET foo/bar"; char *path = request + 3; *path = '\0'; ++path; printf("Type %s\nPath %s\n", request, path);
Hi,
danke für deine Antwort. Ja, das mag wohl sein, es ist aber nicht die Aufgabe auf Sicherheitslücken zu achten. Wir sollen einfach ein Client/Server schreiben, welches die Methoden GET,PRIME und COMPUTE abarbeitet. Mehr nicht.
Ich habe eben die Beiträge von Wurz mal durchforstet, und musste viele male feststellen, dass er hier nur unterwegs ist, damit er sein Ego aufbauen kann. Hier im Internet aufmucken, aber im sozialen Leben immer auf den Boden gucken.
-
Hätte da noch eine Frage
Es ist ja so, dass ich am Server erst überprüfen muss, ob es sich um GET,PRIME oder COMPUTE handelt. In deinem Falle setze ich ja path direkt auf: request + 3 (also für GET). Mit strcmp kann ich das zwar überprüfen, aber das geht halt nur wenn ich GET,PRIME oder COMPUTE alleine eingeben ohne weiteres.
Wie kann ich das realisieren so, dass er erst guckt um welches request es sich handelt und danach erst das Array aufteilt?
-
ich muss mich leider Wutzs Meinung anschließen. Lerne erstmal richtig C bzw. Stringbehandlung. Wenn du das hast, dann hat sich dieser Thread erübrigt. Btw. RTFM! z.b. strncmp
-
muca66 wollte einfach nur wissen, wie er eine bestimmte Problemstellung lösen kann.
Jetzt hat man als Leser genau drei Möglichkeiten:
- Posting ignorieren
- Einen sinnvollen Beitrag schreiben
- Posten, der TE schaffe es sowieso nicht, rtfm etc.
Die dritte Option ist selten die Richtige, weder im realen Leben noch im Internet (Person A: "Ich möchte abnehmen". Person B: "Schaffste' nicht, bist' zu undiszipliniert!").
Sinnvoller wäre es an dieser Stelle, zu erklären, wie man Strings vergleichen kann.
So zum Beispiel:int compare(const char* First1, const char* Last1, const char* First2, const char* Last2) { for (; First1 != Last1 && First2 != Last2 ;++First1, ++First2) { if(!(*First1) || !(*First2)) // Nullterminierung return ((!(*First1) && (!(*First2)))?0:(!(*First1))?-1:1); if(*First1!=*First2) return *First1<*First2?-1:1; } return ((First1==Last1 && First2 == Last2)?0:(First1==Last1)?-1:1); // Adressen vergleichen }
Das heißt, man iteriert durch die beiden Strings, schaut, ob das Nullterminierungszeichen ('\0' Wert: 0) gefunden wurde, wenn nein, werden die beiden chars verglichen.
Getestet ist das Alles nicht komplett, du kannst es dir aber einmal anschauen, experimentieren und schlussendlich Funktionen wie strncmp verwenden.Edit : Hier ein Beispiel
-
Vicious Falcon schrieb:
muca66 wollte einfach nur wissen, wie er eine bestimmte Problemstellung lösen kann.
Jetzt hat man als Leser genau drei Möglichkeiten:
- Posting ignorieren
- Einen sinnvollen Beitrag schreiben
- Posten, der TE schaffe es sowieso nicht, rtfm etc.
Die dritte Option ist selten die Richtige, weder im realen Leben noch im Internet (Person A: "Ich möchte abnehmen". Person B: "Schaffste' nicht, bist' zu undiszipliniert!").
Sinnvoller wäre es an dieser Stelle, zu erklären, wie man Strings vergleichen kann.
So zum Beispiel:int compare(const char* First1, const char* Last1, const char* First2, const char* Last2) { for (; First1 != Last1 && First2 != Last2 ;++First1, ++First2) { if(!(*First1) || !(*First2)) // Nullterminierung return ((!(*First1) && (!(*First2)))?0:(!(*First1))?-1:1); if(*First1!=*First2) return *First1<*First2?-1:1; } return ((First1==Last1 && First2 == Last2)?0:(First1==Last1)?-1:1); // Adressen vergleichen }
Das heißt, man iteriert durch die beiden Strings, schaut, ob das Nullterminierungszeichen ('\0' Wert: 0) gefunden wurde, wenn nein, werden die beiden chars verglichen.
Getestet ist das Alles nicht komplett, du kannst es dir aber einmal anschauen, experimentieren und schlussendlich Funktionen wie strncmp verwenden.Edit : Hier ein Beispiel
Das ist doch mal ein super Beitrag.
Wie man so schön sagt: "Kein Meister ist vom Himmel gefallen".
Wenn man eine Idee hat, dann schreibt man das einfach rein. Wenn nicht, dann einfach auf das Zurück-Button im Browser klicken, das wars.
-
muca66 schrieb:
Wenn man eine Idee hat, dann schreibt man das einfach rein. Wenn nicht, dann einfach auf das Zurück-Button im Browser klicken, das wars.
Verpacken wir es also mal supi konstruktiv: Du solltest vorher ein oder besser zwei C-Bücher durcharbeiten. Losgelöst vom Server erstmal Basistechniken und Standard-Tricks der C-Gemeinde üben. Da Du ja C im Prinzip schon kannst, und nur auffrischen mußt, klappt das in vier Wochen. Danach geht's dann so viel besser von der Hand, daß Du die vier investierten Wochen ruck zuck wieder gewinnst und noch viel mehr.
Einen Blick wert wären noch
strchr mit rüdigers Schnippeltechnik
oder gleich strtok.
-
Vicious Falcon schrieb:
Sinnvoller wäre es an dieser Stelle, zu erklären, wie man Strings vergleichen kann.
So zum Beispiel:int compare(const char* First1, const char* Last1, const char* First2, const char* Last2) { for (; First1 != Last1 && First2 != Last2 ;++First1, ++First2) { if(!(*First1) || !(*First2)) // Nullterminierung return ((!(*First1) && (!(*First2)))?0:(!(*First1))?-1:1); if(*First1!=*First2) return *First1<*First2?-1:1; } return ((First1==Last1 && First2 == Last2)?0:(First1==Last1)?-1:1); // Adressen vergleichen }
Das heißt, man iteriert durch die beiden Strings, schaut, ob das Nullterminierungszeichen ('\0' Wert: 0) gefunden wurde, wenn nein, werden die beiden chars verglichen.
Da ich den ?:-Operator nicht sehr mag, hab ichÄs mal versucht, umzuschreiben (auch ungetestet).
int compare(const char* First1, const char* Last1, const char* First2, const char* Last2) { for (;First1!=Last1 && First2!=Last2; ++First1,++First2) { if(*First1!=*First2) return *First1-*First2; if(*First1=='\0') return 0; } return (First2==Last2)-(First1==Last1); }