Als ich bemerkte, dass memcpy eigenartige Vorstellungen von der Zellengröße hat, habe ich mir schnell eine eigene Funktion gemacht.
strcpy: Kopiert source nach dest. Falls dest nicht groß genug ist, wird der überstehende Rest abgeschnitten.
stock strcpy(dest[], const source[], maxlength=sizeof dest)
{ strmid(dest, source, 0, strlen(source), maxlength); }
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Da mir die explode-Funktion aus PHP sehr gefehlt hat, habe ich sie nachgemacht. Es gibt noch eine andere im offiziellen SA-MP Forum, die auch Anführungszeichen unterstützt und darin eingeschlossene Strings als ein Wort betrachtet, damit kann meine Funktion leider nicht dienen. Dafür ist bei meiner die Größe des Arrays sowie auch die Länge der einzelnen Teile unabhängig wählbar. (Damals hatte ich noch kein strcpy, daher ist alles noch mit strmid gemacht)
explode: Teilt ensemble an den Stellen, an denen separator vorkommt und returnt alle Teile in pieces.
stock explode(const separator[], const ensemble[], pieces[][], piecesize=sizeof pieces[])
{
new i, p1, p2;
new addend;
p1 = strfind(ensemble, separator);
p2 = strfind(ensemble, separator, false, p1+1);
addend = strlen(separator);
if(p1 == -1)
{ strmid(pieces[0], ensemble, 0, piecesize, piecesize); }
else
{
strmid(pieces[0], ensemble, 0, p1, piecesize);
for(i=1; p2>-1; i++, p1=p2, p2=strfind(ensemble, separator, false, p1+1))
{ strmid(pieces[i], ensemble, p1+addend, p2, piecesize); }
strmid(pieces[i], ensemble, p1+addend, strlen(ensemble), piecesize);
}
}
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Nicht lange nach explode brauchte ich auch das Gegenstück dazu. Hier ist leider ein Bytemaximum vorhanden, das man ja aber einfach erweitern kann.
implode: Nimmt die Teile aus pieces und setzt sie - jeweils getrennt durch separator - zu einem String zusammen. (Umkehrung von explode)
stock implode(const separator[], pieces[][], piececount=sizeof pieces)
{
new i;
new ensemble[256] = "";
for(i=0; i<piececount; i++)
{
if(!strlen(pieces[i]))
{ continue; }
format(ensemble, sizeof(ensemble), "%s%s%s", ensemble, pieces[i], separator);
}
strdel(ensemble, strlen(ensemble)-strlen(separator), strlen(ensemble));
return ensemble;
}
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
So, das war's für's Erste. Vielleicht veröffentliche ich irgendwann noch ein paar andere Funktionen.
Ich kann nicht garantieren, dass alle Funktionen in allen Fällen einwandfrei funktionieren - natürlich sollten sie, aber Fehler kann es immer mal geben. Würde mich freuen, wenn ihr mir Probleme oder Fehler berichtet, falls ihr welche findet.