1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

qsort problem

  • AlexW
  • 17. April 2009 um 20:51
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • AlexW
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 20:51
    • #1

    Guten Abend zusammen

    Ich habe ein kleines Problem mit der qsort Funktion
    bin ziemlicher Einsteiger beim Programmieren und gerade mit einer qsort-Funktion beschäftigt die Dateiinhalte sortieren soll nun tritt folgendes Problem auf:

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int sort_down(const void *p1, const void *p2)
    {
       return (strcmp(* (char * const *) p1, * (char * const *) p2) )* -1;
    }
    
    
    int sort_up(const void *p1, const void *p2)
    {
       return strcmp(* (char * const *) p1, * (char * const *) p2);
    }
    
    
    int
    main(int argc, char *argv[])
    {
        int j;
    
    
       qsort(&argv[1], argc - 1, sizeof(char *), sort_up);         //aufsteigend sortieren
       //qsort(&argv[1], argc - 1, sizeof(char *), sort_down);    //absteigend
    
    
       for (j = 1; j < argc; j++)
            puts(argv[j]);
        exit(EXIT_SUCCESS);
    }
    Alles anzeigen
    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define ANZ 5
    
    
    static int
    sort(const void *p1, const void *p2)
    {
    
    
       return strcmp(* (char * const *) p1, * (char * const *) p2);
    }
    
    
    int
    main()
    {
       int i;
       char array[ANZ];
    
    
        array[0] = 7;   
        array[1] = 5;
        array[2] = 2;
        array[3] = 3;
        array[4] = 1;
    
    
           qsort(array, ANZ, sizeof(char *), sort);
    
         for (i = 0; i < ANZ; i++)
            printf("%c\n", array[i]);
    
        exit(EXIT_SUCCESS);
    }
    Alles anzeigen


    1) Ich kann über Argumentzeile Zahlen und Buchstaben auf und absteigend sortieren (Code 1)
    wieso funktioniert das nicht mit einem Array (Code 2)

    2) Wie sortier ich überhaupt eine Datei? Speicher ich den Dateiinhalt in ein Array das ich dann sortiere oder geht das auch einfacher?


    bin für jeden Vorschlag dankbar

    mfg Alex

  • Paulchen
    Gast
    • 17. April 2009 um 21:01
    • #2

    Im ersten Fall hast du sortierst du etwas vom Typ char **, im zweiten Fall vom Typ char *.

    Im zweiten Fall speicherst du außerdem ganze Zahlen in ein char-Array. strcmp sieht diese Zahlen dann als Strings an, findet kein abschließendes '\0' => Chaos bzw. Segmentation fault.

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:10
    • #3

    Danke für die schnelle Antwort

    wie kann ich denn Segmention Fault beim 2. Fall vermeiden?
    bzw

    Code
    array[0] = "a"; würde auch nicht funktionieren oder?


    wie krieg ich das mit EOS gebacken?

    mfg Alex

  • damike
    Punkte
    681
    Beiträge
    111
    • 17. April 2009 um 21:11
    • #4

    Schreibs einfach um

    C
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int compare(const void *a, const void *b)
    {
        return (*(char*)a - *(char*)b);
    }
    
    
    int main ()
    {
        char array1[] = { 'a', 'c', 'b'};
        char array2[] = { 1,2,3 };
    
        qsort (array1, 3, sizeof(char), compare);
        qsort (array2, 3, sizeof(char), compare);
    
        int c;
        for (c=0; c<3; ++c)
            printf ("%c ", array1[c]);
    
        for (c=0; c<3; ++c)
            printf ("%d ", array2[c]);
    
        return 0;
    }
    Alles anzeigen

    Und mit %c bei deinen integralen Werten wirst du nicht viel sehen - siehe Ascii Tabelle ;)

    lg

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:20
    • #5

    danke vielmals :thumb:

    und wie kann ich das ganze jetzt auf eine Datei gesehen anwenden?
    zu mal ich da ja nicht mit %c und %d ausgebn kann sondern die ganze Datei betrachten muss, gibt es da ne Möglichkeit?

    oder kann ich eben den Dateiinhalt in ein Array speichern dann müsste ich aber irgendwie zwischen den Dateitypen unterscheiden

    Einmal editiert, zuletzt von AlexW (17. April 2009 um 21:25)

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:23
    • #6

    also was ich bisher habe

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    #define FALSE 0
    #define TRUE  1
    
    
    int main (int argc, char *argv[])
    {
    
    
    FILE* f;
    char c;
    
    
    if(argc < 2) 
       {
        fprintf(stderr, "Fehlerhafe Eingabe");
             return EXIT_FAILURE;
    
       }
    
       else if(getopt(argv[1],"h") == TRUE ) 
       {
          help();
          exit(EXIT_SUCCESS);
       }
    
    
       else if(getopt(argv[1],"t") == TRUE ) 
       {
    
        f = fopen(argv[2], "r");
    
        //qsort(f, ANZ, sizeof(char *), compare);    
    
        if (f == NULL)
            fprintf(stderr, "Datei %s konnte nicht geoeffnet werden", argv[2]);
        else
        {
        while((c=getc(f)) != EOF)
        putc(c, stdout);    
        }
    
          exit(EXIT_SUCCESS);
       }
    
    
    return 0;    
    
    
    }
    Alles anzeigen
  • damike
    Punkte
    681
    Beiträge
    111
    • 17. April 2009 um 21:32
    • #7

    Hmm. Was willst du genau machen? Du hast eine Datei mit Werten (Strings und inigerale Typen) und willst die einlesen und sortieren?

    EDIT: Bzw. integrale Typen in der Datei ja auch mehr oder weniger Strings sind ;)

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:36
    • #8

    eine beliebige (binär)Datei sortieren entweder auf- oder absteigend
    wobei ich mir nicht im klaren bin wie man Sonderzeichen (,;?=) sortieren kann (außer vl nach ASCII)

  • skinner33
    Punkte
    862
    Beiträge
    168
    • 17. April 2009 um 21:38
    • #9

    Du könntest auch einfach mal in den passenden Thread im Sysprog Forum schauen

  • damike
    Punkte
    681
    Beiträge
    111
    • 17. April 2009 um 21:44
    • #10

    Du musst den Wert in der Datei ja irgendwie interpretieren. Also zu sagen was da jetzt für ein Typ steht geht ohne weiteres nicht.
    Array kannst verwenden oder wenns online gehen muss z.B. 2-4 Baum (also wenn du es bearbeiten können musst o.ä.)

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:46
    • #11
    Zitat von skinner33

    Du könntest auch einfach mal in den passenden Thread im Sysprog Forum schauen

    ok hätt ich doch besser genauer geschaut
    danke werd mir das mal zu Gemüte führen

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:48
    • #12
    Zitat von damike

    Du musst den Wert in der Datei ja irgendwie interpretieren. Also zu sagen was da jetzt für ein Typ steht geht ohne weiteres nicht.
    Array kannst verwenden oder wenns online gehen muss z.B. 2-4 Baum (also wenn du es bearbeiten können musst o.ä.)

    wenn ich jetzt ne beliebige Datei hätte (einfaches bsp)

    Zitat

    defacb34tz1

    könnte ich da einfach jedes Zeichen als "string" verwenden und sortieren wies mit argc, argv schon funktioniert hat?

  • damike
    Punkte
    681
    Beiträge
    111
    • 17. April 2009 um 21:56
    • #13

    Puh. Kann man pauschal imo nicht beantworten - muss allerdings sagen, dass ich die Aufgabenstellung auch nicht genau kenn. Wenn readable chars geschrieben wurden dann nimm meine Version - wenn z.B. 6er Zeichenblöcke sind deine. Hab zu dem oben genannten Forum keinen Zugriff - kanns dir daher auch nicht genau sagen ;)

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 17. April 2009 um 21:58
    • #14

    nja danke auf jeden Fall mal
    jetzt hab ich eh das Wochenende Zeit und werd mir das alles mal in Ruhe anschauen mal schauen was dabei rauskommt

  • Adok
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 07:47
    • #15

    http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

    Mach's so wie in dem Beispielprogramm beschrieben. Nicht als String nehmen, sondern als Zeichen.

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 08:38
    • #16
    Zitat von Adok

    http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

    Mach's so wie in dem Beispielprogramm beschrieben. Nicht als String nehmen, sondern als Zeichen.

    da isses doch nur mit integers
    das funktioniert doch mit anderen Zeichen nicht oda versteh ich da grad was nicht

  • Adok
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 09:00
    • #17

    Zeichen (char) sind nichts Anderes als Integers.
    Du könntest auch schreiben:

    Code
    int integerVariable = 'A';

    Das ist ebenso möglich wie:

    Code
    char zeichenVariable = 255;

    Alles klar?

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 09:07
    • #18

    ja soweit is mir schon klar
    aber wenn ich mit dem qsort jetztdurch ne datei fege (Text) dann beachtet er doch nicht den ascii oda?

  • Adok
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 10:46
    • #19

    Eine Textdatei ist wie eine Zeichenkette eine Ansammlung von Zeichen, die durch ihre ASCII-Codes repräsentiert werden.

  • AlexW
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 11:59
    • #20

    hab jetzt wieder auf meinen erste versuch mit argc argv zurückgegriffen und werd das über 2d array in ein qsort für Dateien ummodeln

  1. Datenschutzerklärung
  2. Impressum