Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » strsplit

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.07.2007, 15:37 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


So nachdem sich hier ja nichts tut hab ich mal wieder ein kleines Rätsel.

gegeben ist folgender Code:


C++:
#include <stdio.h>

char* strsplit(char* b, const char **d, int c)
{
    
}

char Text[] = "Das,ist ein+#Testtext+#für die,StringsplitabcFunktion!";
const char *seps[] = {",","+#","abc","!"," "};

int main()
{
    char* c;
    while(c=strsplit(Text,seps,5))
    {
        printf("%s\n",c);
    }
}



Zu schreiben ist der Code zwischen den {} der strsplit Funktion so das jeweils der nächste Teilstring zurück gegeben wird der von irgendwelchen der übergebenen Trennzeichen begrenz wird.

Zur Überprüfung sollte am Ende folgende Ausgabe erscheinen:

Zitat:

Das
ist
ein
Testtext
für
die
Stringsplit
Funktion



Es dürfen keine weiteren Header hinzugefügt werden.
Da ich mir das gerade erst ausgedacht habe weiß ich nicht was ein angemessenes Par wäre also erstmal ohne
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.07.2007, 18:16 Uhr
virtual
Sexiest Bit alive
(Operator)


Hm,

die Funktion muß wohl eine statische Variable haben, wie?

Nun ja, zunächst mal ein 179er Versuch:


C++:
static char*l=0;int i,j,k;if(*(b=l=l?l:b)){for(k=0;b[k];k++){for(i=0;i<c;i++){j=0;while(d[i][j]==b[k+j]&&b[k+j])j++;if(!d[i][j])return b[k]=0,l=b+j+k,b;}}}else b=0;l=b+k;return b;


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.07.2007, 18:24 Uhr
0xdeadbeef
Gott
(Operator)


In der Annahme, dass "keine weiteren Header" auch "keine weiteren Deklarationen" bedeutet,

C++:
char* strsplit(char* b, const char **d, int c)
{
  static char *save_ptr = NULL;
  static char *orig_ptr = NULL;

  char *ret;
  char const *cmp_d, *cmp_sp;;
  int i;

  if(orig_ptr != b) {
    orig_ptr = save_ptr = b;
  }

  if(!*save_ptr)
    return NULL;

  for(ret = save_ptr; *save_ptr; ++save_ptr) {
    for(i = 0; i < c; ++i) {
      for(cmp_d = d[i], cmp_sp = save_ptr;
          *cmp_d && *cmp_d == *cmp_sp;
          ++cmp_d, ++cmp_sp);
      if(!*cmp_d) {
        for(; save_ptr != cmp_sp; ++save_ptr) {
          *save_ptr = '\0';
        }
        return ret;
      }
    }
  }

  return ret;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 19.07.2007 um 18:26 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.07.2007, 09:41 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von virtual:

die Funktion muß wohl eine statische Variable haben, wie?


ich würde sagen ja.

Ich werd mich heute Abend oder am WE auch mal an einer Lösung versuchen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.07.2007, 11:24 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Also mein erster Versuch sieht so aus:

C++:
int i,j,g;static char*p=0;for(p?b=++p:p=b;*p;++p)for(i=0;i<c;++i){g=0;for(j=0;d[i][j];++j)if(d[i][j]!=p[j]){g=1;break;}if(!g){*p=0;p+=j-1;return b;}}return 0;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.07.2007, 13:43 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Konnte noch das blöde g rauskürzen so dass ich jetzt auf 152 bin

C++:
int i,j;static char*p=0;for(p?b=++p:p=b;*p;++p)for(i=0;i<c;++i){for(j=0;d[i][j];++j)if(d[i][j]!=p[j])break;if(!d[i][j]){*p=0;p+=j-1;return b;}}return 0;


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.09.2007, 14:28 Uhr
kronos
Quotenfisch
(Operator)


Na klar, kaum fahr ich in Urlaub schon wird hier wieder gegolft.

C++:
static x=0,y,z;char*w=b+=x;do{for(++x,y=0;y<c;++y){for(z=0;d[y][z]==w[z];++z);if(!d[y][z])*w=0,x+=z;}}while(*w++);--x;return *b?b:0;

132 für den Anfang, im Verteidigungsfall kann ich's aber noch kleiner pfrimeln.

Will jetzt vllt auch jemand hier mitspielen:
www.fun-soft.de/showtopic.php?threadid=17727

*UnermüdlichFürDieErhaltungderFunSoftGolfKulturKämpf*
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: