C Funktion ähnlich bzw. gleich PHP explode

Dieses Thema im Forum "C/C++" wurde erstellt von Sir Auron, 29.07.2004.

  1. #1 Sir Auron, 29.07.2004
    Sir Auron

    Sir Auron Routinier

    Dabei seit:
    26.04.2004
    Beiträge:
    482
    Zustimmungen:
    0
    Abend!
    Gibt es in C eine Standart Funktion, die ähnlich bzw. gleich der PHP Funktion explode ist? Ich hab schon versucht eine nachzuprogrammieren hab die PHP Sources 2-5 runtergeladen da nachgegukt bin aber bei PHP3 (dort tauch explode das erste Mal auf) nicht mehr durchgestiegen (zu viele aneinandergekette Header). Wenn es keine Std. Funktion gibt, wie müsste dann eine eigene aussehen?

    Danke
    Sir Auron
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. oenone

    oenone Freier Programmierer[Mod]

    Dabei seit:
    22.08.2002
    Beiträge:
    599
    Zustimmungen:
    0
    Ort:
    Mannheim
    hm.. ist das sowas wie strtok(3) ?

    auf bald
    oenone
     
  4. #3 ExRevel, 30.07.2004
    Zuletzt bearbeitet: 30.07.2004
    ExRevel

    ExRevel Routinier

    Dabei seit:
    16.02.2003
    Beiträge:
    430
    Zustimmungen:
    0
    Ort:
    Stuttgart
    explode() zerteilt einen String anhand eines Trennzeichens schneller als split(), das es keine Suchmuster zulässt. Also es funktioniert schon so wie ein Tokenizer und kommt dem Prinzip von strtok sehr nahe, ist aber natürlich tausendmal komfortabler :) Ich hab einen Minitokenizer in C++ verfasst, der kommt explode() schon ein bissal näher. Wie toll er ist kann ich nun nicht sagen:
    Code:
    void split(vector<string> *list, char* buffer) {
    
    	string stringbuffer(buffer);
    
    	int n, m;
    
    	m = 0;
    	for (n = 0; n < strlen(buffer); n++)
    		if (buffer[n] == ';') 
    			m++;
    
    	int seperator[m];
    			
    	m= 0;
    	for (n =0; n < strlen(buffer); n++) {
    		if (buffer[n] == ';') {
    			seperator[m] = n;
    			m++;
    		}
    	}		
    
    	string first_element = stringbuffer.substr(0, seperator[0]);
    	list->push_back(first_element);
    
    	for (n = 0; n < m; n++) {
    	
    		int size;
    		size = seperator[n+1] - (seperator[n]+1);
    		string temp = stringbuffer.substr(seperator[n]+1, size);
    
    		list->push_back(temp);
    	}
    }
    
    Damit erhälst du einen Vector zurück den du benutzen kannst wie ein Array, in dem du die Teilstrings findest. Die Funktion teilt derzeit nach dem Semikolon auf, aber dies dynamisch zu gestallten sollte doch sehr leicht sein.

    ciao Exi
     
  5. #4 Sir Auron, 30.07.2004
    Sir Auron

    Sir Auron Routinier

    Dabei seit:
    26.04.2004
    Beiträge:
    482
    Zustimmungen:
    0
    Ich machs doch nicht so kompliziert wie ich dachte. Da reicht strtok. Aber danke.
     
  6. oenone

    oenone Freier Programmierer[Mod]

    Dabei seit:
    22.08.2002
    Beiträge:
    599
    Zustimmungen:
    0
    Ort:
    Mannheim
    du solltest mit strtok aufpassen..

    1. du kannst strtok() nicht an mehreren stellen zur gleichen zeit benutzen (es benutzt einen static buffer)
    2. du kansnt strtok() nicht in einem multithreaded programm benutzen
    3. du kannst strtok() nicht in einer bibliothek benutzen, die in einem multithreaded programm verwendet werden soll
    4. strtok() veraendert die ursprungswerte, kann unerwuenschte seiteneffekte haben
    5. strtok() arbeitet zeilenbasiert, du brauchst also einen buffer so gross wie die laengste zeile. das kann zu speicherverschwendung fuehren.

    (sinngemaess uebersetzt, von "Thinking in C++", dort gibt es auch ein Codebeispiel fuer einen StreamTokenizer und einen generell einsetzbaren Tokenizer..)

    auf bald
    oenone
     
  7. etuli

    etuli Betrunken

    Dabei seit:
    12.04.2003
    Beiträge:
    278
    Zustimmungen:
    0
    Die manpage drueckt es aehnlich aus
    Code:
    BUGS
           Never use these functions. If you do, note that:
    
                  These functions modify their first argument.
    
                  The identity of the delimiting character is lost.
    
                  These functions cannot be used on constant strings.
    
                  The  strtok()  function  uses a static buffer while
                  parsing, so it's not thread safe. Use strtok_r() if
                  this matters to you.
    
    Andererseits koenntest du auch mal schauen, ob strsep nicht besser zu deinem Anforderungsprofil passt. Hat allerdings die selben Einschraenkungen wie strtok(). ;o)
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

C Funktion ähnlich bzw. gleich PHP explode

Die Seite wird geladen...

C Funktion ähnlich bzw. gleich PHP explode - Ähnliche Themen

  1. CentOS 7.2: Mailversand funktioniert obwohl nicht definiert

    CentOS 7.2: Mailversand funktioniert obwohl nicht definiert: Hallo Habe CentOS 7.2 installiert/konfiguriert. Testweise habe ich eine mail versendet: mail -s "test mail" email@adresse.de May 25 15:45:04...
  2. In eigener Sache: Neue, stark verbesserte Suchfunktion

    In eigener Sache: Neue, stark verbesserte Suchfunktion: Pro-Linux läuft nun mit der erneuerten Version 1.5 des Content Management Systems NB3. Die wichtigste sichtbare Änderung ist die neue, auf der...
  3. Funktionssuche in C: Emacs oder Vim?

    Funktionssuche in C: Emacs oder Vim?: Hallo, ich muss mir häufig C-Projekte angucken, und dann suche ich bspw., wo eine aufgerufene Funkion definiert oder deklariert (Header) wird....
  4. FAI 5 mit Autodiscover-Funktion

    FAI 5 mit Autodiscover-Funktion: Die Entwickler des Softwarewerkzeugs zur vollautomatischen Installation von Betriebssystemen und Anwendungen haben mit FAI 5 eine neue Version des...
  5. Suse Linux Enterprise 11 SP4 verbessert Sicherheitsfunktionen

    Suse Linux Enterprise 11 SP4 verbessert Sicherheitsfunktionen: Suse hat das mittlerweile vierte Service Pack für Suse Linux Enterprise 11 veröffentlicht. Die neue Ausgabe liefert erweiterte...