Forum: Compiler & IDEs Funktionen und Array's


von Sascha (Gast)


Lesenswert?

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

von Curby23523 N. (Gast)


Lesenswert?

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
}

von Nop (Gast)


Lesenswert?

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
}

von Yalu X. (yalu) (Moderator)


Lesenswert?

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?

von Nop (Gast)


Lesenswert?

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? :-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von Mikro 7. (mikro77)


Lesenswert?

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.

von Keiner N. (nichtgast)


Lesenswert?

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
von Mikro 7. (mikro77)


Lesenswert?

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
}

von Sascha (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.