Hallo,
ich versuche mich gerade daran, Zeichenketten zu sortieren. Folgende
Funktion soll Zeichen für Zeichen vom Quellarray zum Zielarray kopieren,
bis das zu übergebende End of Text Zeichen kommt.
void sortiere_zeichen(char *ziel, char *quelle, char eot)
{
uint8_t ready=0;
char zeichen;
while(!ready)
{
zeichen=*quelle;
if(zeichen!=eot)
{
*ziel=zeichen;
ziel++;
quelle++;
}
else
{
ready=1;
*ziel='\0';
}
}
}
Ich tue mich momentan etwas schwer mit den Pointern. Geht das so oder
gibt es eine elegantere Lösung?
Gruß Sascha
Besser ist es allerdings, wenn man solche Stringfunktionen gleich mit
Längencheck macht. n ist dabei die Größe des Zielbuffers, damit man
keinen buffer overflow baut. Zudem kann man auch einfach eine Funktion
aus der Standard Library nehmen, da muß man nur für die terminierende
Null noch etwas dranbasteln:
Sascha schrieb:> Geht das so
Sieht richtig aus. Ich würde aber das "ready" durch "fertig" ersetzen.
Das trifft den Sinn besser und passt sprachlich besser zum restlichen
Code.
> oder gibt es eine elegantere Lösung?
Was man als elegant empfindet, hängt ein wenig vom persönlichen
Geschmack ab. Mein Geschmack empfindet dieses als elegant:
1
voidkopiere(char*ziel,char*quelle,chareot){
2
while((*ziel++=*quelle++)!=eot);
3
*ziel='\0';
4
}
Nop schrieb:> ziel = memccpy(ziel, quelle, eot, n);
Seit wann hat memcpy aus der Standardbibliothek 4 Argumente?
Yalu X. schrieb:> Nop schrieb:>> ziel = memccpy(ziel, quelle, eot, n);>> Seit wann hat memcpy aus der Standardbibliothek 4 Argumente?
Gar nicht. Gegenfrage: wo siehst Du memcpy? :-)
Nop schrieb:>> Seit wann hat memcpy aus der Standardbibliothek 4 Argumente?>> Gar nicht. Gegenfrage: wo siehst Du memcpy? :-)
Die Frage ist berechtigt. Ja, ich habe das zweite c übersehen :)
Zu beachten ist allerdings, dass memccpy nicht Teil der
ISO-Standardbibliothek, sondern eine POSIX-Erweiterung ist.
Mikro 7. schrieb:> Das ist aber nicht die Funktion des TS.
Wow, bloß nicht zu viele Informationen geben. Nicht, dass noch einer
einfach nachvollziehen kann was du meinst.
dann eben so:
1
voidkopiere(char*ziel,char*quelle,chareot){
2
while((*ziel++=*quelle++)!=eot);
3
*(ziel-1)='\0';
4
}
Puh, ist ja völlig anders geworden.
Was trozdem fehlt, ist die Überprüfung auf ein Ende des Strings. Hat der
TE aber auch nicht drin. Was wenn der eot gar nicht vorkommt.
Keiner N. schrieb:> Wow, bloß nicht zu viele Informationen geben.
Das war Absicht: "Persönlicher Geschmack" ist nicht unbedingt
"übersichtlich". Besser gefällt mir daher:
Hallo,
erstmal Danke für die Antworten. Mir geht es darum, in einem vorhanden
String einen Bereich zu kopieren, Bus ein definiertes Trennzeichen
erscheint. Habe mich vielleicht etwas ungünstig ausgedrückt.
Mein Problem bestand darin, Die Pointer zu interpretieren. Aber die
Lösung von Mikro77 sieht super aus.
Gruss Sascha