Probleme mit Zeigern (war: Namen sortieren klappt nicht!)



  • Hallo erstmal.

    Ich habe folgendes Problem. Ich soll ein Programm schreiben, was eingegebene Namen sortiert. Hier der Quelltext:

    #include <conio.h>
    //#include <math.h>
    #include <stdio.h>
    #include <string.h>
    //#include <malloc.h>
    
    int main()
    {
    
     char *sort[4];
     sort[0]="a";sort[1]="a";sort[2]="a";sort[3]="a";sort[4]="a"; //ohne das geht es nicht, Warum??
    
     int i,j;
     char eingabe;
     char *temp;
    
     for(i=0; i<4; i++)  scanf("%s",sort[i]);
    
     for(i=0; i<4; i++)
      {
    
       for(j=i+1; j<4; j++)
        {
    
         if((strcmp(sort[i],sort[j])>0))
          {
    
           temp=sort[i];
           sort[i]=sort[j];
           sort[j]=temp;
          }
        }
      }
     for(i=0;i<4;i++)
        printf("%s\n",sort[i]);
    getch();
    return 0;
    }
    

    Bei Eingaben länger als 3 Zeichen gibt es Probleme.
    Und warum muß das vorher stehen? sort[0]="a";sort[1]="a";sort[2]="a";...

    Ich benutze den C++ Builder 5 Update Pack1.

    Ich wäre für eure Hilfe echt dankbar.

    Mfg Christian

    <edit>Bitte Code-Tags benutzen!</edit>
    **<edit2>**Überschrift dem Problem angepasst.[/b]

    [ Dieser Beitrag wurde am 30.11.2002 um 17:41 Uhr von junix editiert. ]



  • Original erstellt von ChristianBr:
    Bei Eingaben länger als 3 Zeichen gibt es Probleme.

    Ich glaub da fehlen grundlegende C-Kenntnisse. Eigentlich ist es schon ein Glück für dich, dass es mit 3 Zeichen noch funktioniert. Beantworte mir doch bitte folgende Frage:

    char *sort[4];
    

    Was wird hier deklariert?

    Ahja, noch was: Deine Quellen solltest du - zu deinem Eigenen verständnis aber auch aus Rücksicht auf andere Forenteilnehmer - immer kommentieren. Gerade Schleifen sind immer wieder kritisch, wenns ums Verständnis geht.

    -junix

    [ Dieser Beitrag wurde am 30.11.2002 um 13:57 Uhr von junix editiert. ]



  • Hi,

    wahrscheinlich willst du das nicht aber wieso benutzt nicht eine Stringliste zum sortieren. Ein Vorteil wäre zB das das Dingen ExceptionSave ist. Oder geht das in deinen Programmfall nicht?

    🙄



  • Danke für die Antworten.

    Ich benutze keine Stringliste( 😕 ExceptionSave 😕 ) , weil ich nicht weiß, wie das geht. 😞

    Kannst du mir zeigen, wie das mit der Stringliste geht?
    Oder kannst du mir zeigen, wie ich das Problem mit Strcmp und den Zeigern hinbekomme?

    Zum Quelltext(Nach 3 Stunden probieren 😡 mit Beschriftung und neuer Fehlermeldung)

    ////////////////////////////////////////////////////////////////////////////////
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    
     char sort[50],*sortptr;                               //EingabeString mit Zeiger
     sortptr=sort;                                         //Zeigerzuordnung
     int i,j;                                              //Index der For-Schleifen
     char *temp;                                           //Zeiger(für STRCMP
    
     for(i=0; i<4; i++)  scanf("%s",sortptr[i]);          //Eingabe der Namen
    
     for(i=0; i<4; i++)                                   //  Der Selectionsortalgorithmus
      {                                                   //
                                                          //
       for(j=i+1; j<4; j++)                               //
        {                                                 //
                                                          //
         if((strcmp(sortptr[i],sortptr[j])>0))            // Konvertierung von 'char *' nach 'char' nicht möglich
          {                                               //
                                                          //
           temp=sortptr[i];                               //
           sortptr[i]=sortptr[j];                         //
           sortptr[j]=temp;                               //
          }                                               //
        }                                                 //
      }                                                   //
     for(i=0;i<4;i++)
        printf("%s\n",sortptr[i]);                        //Ausgabe
    getch();
    return 0;
    }
    ////////////////////////////////////////////////////////////////////////////////
    

    Mfg Christian

    <edit>Bitte Code-Tags benutzen! (Bereits zum wiederholten mal!)</edit>

    [ Dieser Beitrag wurde am 30.11.2002 um 17:38 Uhr von junix editiert. ]



  • Original erstellt von ChristianBr:
    Danke für die Antworten.

    Ich würde mich ja auch gerne für deine antwort auf meine Frage bedanken.... leider blieb sie ja aus... Es scheint, statt das Ganze systematisch anzugehen, betreibst du lieber etwas Quantenprogrammierung (Es funktioniert - Teilweise - aber man weiss nicht so gneau wieso eigentlich). Sehr enttäuschend. )-:

    Naja, ich versuch mal etwas Licht ins Dunkel zu bringen:

    char *sort[4];    // Du deklarierst ein Array von 4 char-Zeigern
    

    Leider kannst du aber mit Zeigern alleine nichts anfangen, du musst schon Speicher bereitstellen, auf den du zeigen kannst und den du beschreiben darfst.

    Mit dieser Zeile machst du genau das:

    sort[0]="a";sort[1]="a";sort[2]="a";sort[3]="a";sort[4]="a";
    

    Der Compiler gibt dir Speicher, dessen Adresse wir in den Zeiger schreiben können. Auf diesen Speicher hast du Lese- und Schreibzugriff. Allerdings nur für soviele Zeichen wie reserviert wurden. (In deinem Fall also 2 Byte... eines für den Buchstaben "a", das Andere für den Nullabschluss.)

    Des Rätsels Lösung liegt also im Reservieren von Speicher bevor du scanf ausführst.

    Im Übrigen muss ich heut MIttag gepennt haben, denn das ist ein normales ANSI-C problem, ich schieb dich da mal hin.

    -junix

    [ Dieser Beitrag wurde am 30.11.2002 um 17:40 Uhr von junix editiert. ]



  • Hallo junix,

    natürlich auch Danke für deine Antwort, und das du den Text geordnet hast(wie machstd du das??).

    Was meinst du mit <edit>Bitte Code-Tags benutzen! (Bereits zum wiederholten mal!)</edit>? (mein erster Threat in diesem Forum, sorry).

    Ich hab nochmal nen neuen Quelltext hingepackt. Da ist der Char mit 50 Zeichen, auf den der Zeiger zeigt. Das scheint soweit zu funktionieren (Eingabe und Ausgabe), nur der strcmp nimmt, glaube ich, keine Zeiger an. Muß ich den wieder auf eine String zeigen lassen(Da bekomme ich die Meldung L-wert...E2277)??

    Fragen über fragen?

    Mfg Christian



  • nur der strcmp nimmt, glaube ich, keine Zeiger an

    http://www.rt.com/man/strcmp.3.html [EDIT] neue URL [/EDIT]

    Was ist denn ein

    const char *s1;
    

    ?

    Muß ich den wieder auf eine String zeigen lassen

    ?!? Ein C-String IST ein Zeiger...
    Schreib mal die genaue Zeile...

    [ Dieser Beitrag wurde am 30.11.2002 um 18:54 Uhr von Solaris'dUKe editiert. ]



  • Original erstellt von ChristianBr:
    Was meinst du mit <edit>Bitte Code-Tags benutzen! (Bereits zum wiederholten mal!)</edit>? (mein erster Threat in diesem Forum, sorry).

    Wenn du einen Beitrag erstellst hat es unterdem Eingabefeld buttons. Einer dvon heisst C++ Code. Das sind die Code-Tags. Sie fügen ein

    und
    

    ein. Dazwischen kannst du Code schreiben, der dann formatiert wird.

    -junix


Anmelden zum Antworten