Duplikate nicht aufscheinen lassen - C

Hallo,
(int(*)(const void*,const void*))strcmp) soll im Grunde heißen, dass du der qsort-Funktion als Argument eine Funktion mit Rückgabewert int, sowie zwei Parametern des Typs void* übergibst.

Die qsort-Funktion nutzt diese Funktion um deine Werte zu sortieren, da sie gegebenenfalls nicht weiß, wie sie bei eigenen Typen zu verfahren hat. Als simples Beispiel schaue mal über folgenden Code. Du castest die Parameter einfach zu den Typen, die du vergleichen willst (in deinem Falle (char*)) und vergleichst dann. Z.B. mit strcmp.

C++:
int compareMyType (const void * a, const void * b)
{
  if ( *(MyType*)a <  *(MyType*)b ) return -1;
  if ( *(MyType*)a == *(MyType*)b ) return 0;
  if ( *(MyType*)a >  *(MyType*)b ) return 1;
}

Die qsort-Funktion erwartet als ersten Parameter übrigens die Basis deines Arrays. Wenn ich das richtig verstehe, was du gemacht hast, dann ist token aber kein Array. Schau dir nochmal hier das Beispiel der qsort-Funktion an

Grüße,
Jennesta
 
strtok macht eigentlich einen pointer


hab aber das eigentlich problem gefunden:
Die folgende funktion wirft ganz am Ende ein <NULL> pointer raus.

Code:
char *ArraySplitten(char *puffer)
{
  printf("Split array");
  char *token;
  char delimiter1[] = ";";
  char delimiter2[] = "\0";
  
  token = strtok(puffer, delimiter1);
  
  while(token != NULL)
  {
    printf("%s\n", token);
    token = strtok(NULL, delimiter1);
  }
   
  return token;
}

Wie kann ich in der Funktion, mein einträge in einer verkette liste speichern?
 
Zuletzt bearbeitet:
zuerst will ich alle personen auflisten lassen, ohne dass sie doppelt vorkommen... deswegen die funktion array splitten...

bei Person A;Person B, bedeutet der ";" dass sie sich kennen also befreundet sind.
Also habe ich mir gedacht über einen struct die Beziehungen zwischen den Personen herstellen...
 
Zuletzt bearbeitet:
bei Person A;Person B, bedeutet der ";" dass sie sich kennen also befreundet sind.
Also habe ich mir gedacht über einen struct die Beziehungen zwischen den Personen herstellen...

Wenn wir dir helfen sollen, dann müsstest du auch einmal auf unsere Antworten eingehen. Ich habe das Gefühl, dass jeden Beitrag von dir ein neues Problem hinzukommt. Ich weiß inzwishcen gar nicht mehr was du hast und was noch nicht funktioniert.
 
@jennesta: ja, da hast du recht. wenn ich wo hänge, arbeite ich meistens wo anders weiter bis mir etwas einfällt...


um die Personen zu teilen habe ich es nun mit pointern gemacht... (strchr(csvline, ';') gibt mir einen pointer zurück wo der liegt) dann prüfe ich ob ; nicht als erstes oder letztes vorkommt.
ersetze ; mit \0 und lasse einen pointer auf den anfang zeigen und einen nach \0 zeigen so kann ich beide streams einlesen...
 
Zuletzt bearbeitet:
Bei mein programm kommt immer in der addFront funktion zum absturz.
Kann mir jemand helfen und sagen was falsch ist?

ich bekomme keine fehlermeldungen...


Code:
typedef struct llnode
{
  char *name;
  struct llnode *next;
 // struct node *prev;  
} llnode;
  
struct llnode *head = NULL;  //initialiere den head


void addFront(char *prasemi /*, char *postsemi*/)
{
  struct llnode *tempnode1;
 // struct llnode *tempnode2;
  tempnode1 = (struct llnode*)malloc(sizeof(struct llnode));
//  tempnode2 = (struct llnode*)malloc(sizeof(struct llnode));
  strcpy(tempnode1 -> name, prasemi);
//  strcpy(tempnode2 -> name, postsemi);
  
  
  if(head == NULL) 
  {
    head = tempnode1;
    head -> next = NULL;
  }
  else
  {
    tempnode1 -> next = head;
    head = tempnode1;
  }
  
}
 
Hallo 0664jester

C:
strcpy(tempnode1 -> name, prasemi);

Für name ist kein Speicher alloziert, du kopierst hier also den String irgendwo ins Nirvana.

Viele Grüsse
Cromon
 
Zurück