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
Wenn es ein korrekter String ist, ist immer min. das \0 enthalten. Du willst kopieren und nicht sortieren.
1 | void kopieren(char *ziel, char *quelle, char eot) |
2 | {
|
3 | do{ |
4 | *ziel++ = *quelle; |
5 | } while(*quelle++ != '\0'); |
6 | //} while(*quelle++ != eot);
|
7 | }
|
Also erstmal, das mit diesem Flag braucht man in C nicht, ist ja nicht Pascal. Man kann einfach "break" nehmen.
1 | void kopiere_zeichen(char *ziel, const char *quelle, char eot) |
2 | {
|
3 | for(;;) |
4 | {
|
5 | char zeichen=*quelle++; |
6 | if(zeichen!=eot) |
7 | {
|
8 | *ziel++=zeichen; |
9 | }
|
10 | else
|
11 | {
|
12 | *ziel='\0'; |
13 | break; |
14 | }
|
15 | }
|
16 | }
|
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:
1 | #include <string.h> |
2 | |
3 | void kopiere_zeichen(char *ziel, const char *quelle, int eot, size_t n) |
4 | {
|
5 | if (n-- == 0) |
6 | return; |
7 | |
8 | ziel = memccpy(ziel, quelle, eot, n); |
9 | if (ziel != NULL) |
10 | {
|
11 | *ziel = '\0'; |
12 | } else |
13 | {
|
14 | ziel[n] = '\0'; |
15 | }
|
16 | }
|
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 | void kopiere(char *ziel, char *quelle, char eot) { |
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.
:
Bearbeitet durch Moderator
Yalu X. schrieb: > Was man als elegant empfindet, hängt ein wenig vom persönlichen > Geschmack ab. Mein Geschmack empfindet dieses als elegant:
1 | |
2 | void kopiere(char *ziel, char *quelle, char eot) { |
3 | while((*ziel++ = *quelle++) != eot); |
4 | *ziel = '\0'; |
5 | }
|
Das ist aber nicht die Funktion des TS.
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 | void kopiere(char *ziel, char *quelle, char eot) { |
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.
:
Bearbeitet durch User
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:
1 | void kopiere(char *ziel,const char *quelle,char eot) |
2 | {
|
3 | while (*quelle != eot) |
4 | *ziel++ = *quelle++ ; |
5 | *ziel = '\0'; |
6 | }
|
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.