Sort nach Alphabet



  • char foobar[113] = "hier passen nur 112 zeichen rein, das letzte brauchbare ist foobar[111], denn foobar[112] ist der nullterminator";
    printf("%s\n", foobar);
    printf("%c\n", foobar[0]); // das erste zeichen; muesste ein 'h' sein
    printf("%c\n", foobar[111]); // das letzte zeichen; muesste ein 't' sein
    printf("%d\n", fooabr[112]); // muesste eine null sein, denn es ist der nullterminator
    printf("%s\n", foobar[113]); // <-- DAS HIER IST FALSCH!
    

    verstanden?

    ach und: die main funktion ruft man nicht auf, okay?



  • Also Nullterminator ist '\0' oder?

    Hm aber wieso bekomme ich in keinster Weise eine Ausgabe mit der doppelten for Schleife?
    des was du mir erzählt hast hab ich nun gepeilt!
    Aber ich finde einfach meinen bescheuerten Fehler nicht son Mist!!

    Gruß Dami



  • void SortStringAlpha(char AszEingabeStrings[ANZAHL][81],int iAnzahlStrings)
    {
     int i=0,j=0, k=0;
       char temp[81]; 
        strcpy(temp, AszEingabeStrings[i]); 
        strcpy(AszEingabeStrings[i], AszEingabeStrings[j]); 
        strcpy(AszEingabeStrings[j], temp); 
       for(i = 0; i < iAnzahlStrings; i++) {
          for(j = i + 1; j < iAnzahlStrings; j++) {
            if( (strcmp(AszEingabeStrings[i],AszEingabeStrings[j]) > 0) ) {
               *temp=AszEingabeStrings[j][80];
    		   AszEingabeStrings[i][80]=AszEingabeStrings[j][80];
    
              AszEingabeStrings[j][80]=temp;
            }
          }
       }
       for(i = 0; i < iAnzahlStrings; i++)
       {for (k=0; k <iAnzahlStrings;i++)
          printf("\n%s",StringUmdrehen(AszEingabeStrings[i][k]));
       }
    
    }
    

    Mein Code is nun so



  • was du machen willst ist ja zwei strings zu tauschen wenn string "i" (alphabetisch) groesser ist als string "j". diese ueberpruefung uebernimmt strcmp ("string"+"compare").
    um zwei strings zu tauschen muesstest du alle chars aus string i in die entsprechenden chars aus string j kopieren, und alle aus string j nach string i.
    dafuer kannst du entweder eine fertige funktion von c benutzen, naemlich die besagte strcpy ("string"+"copy") oder einfach mit einer schleife alle einzelnen chars eines strings in den anderen kopieren.
    was du im moment machst, ist aber folgendes:

    *temp=AszEingabeStrings[j][81];
    

    schreibt das 82te (faengt ja bei 0 an) zeichen von string j in temp.

    AszEingabeStrings[i][81]=AszEingabeStrings[j][81];
    

    schreibt das 82te zeichen von string j in das 82te zeichen von string i

    AszEingabeStrings[j][81]=temp;
    

    sollte das zeichen, dass du dir in temp gemerkt hast (also das 82te zeichen von string i) in das 82te zeichen von string j kopieren. ist syntaktisch aber nicht mehr ganz richtig, weil temp ja jetzt wiederum ein array ist. um ein einzelnes zeichen von temp anzusprechen muesste das entweder (wie oben) *temp oder temp[0] heissen.
    was du effektiv tust ist also, das nicht existierende 82te zeichen der beiden strings zu tauschen. das macht aber keinen sinn 🙂
    stattdessen muesstest du alle 81 zeichen von string i (dh AszEingabeStrings[i][0] bis AszEingabeStrings[i][80]) in die entsprechenden chars des arrays temp (dh temp[0] bis temp[80]) kopieren.


    danach befinden sich alle einzelnen chars von string i in string j und umgekehrt.
    genau das wuerden die strcpy-zeilen fuer dich erledigen, allerdings hast sie einfach an der falschen stelle eingefuegt. da i und j ausserhalb der schleife =0 sind, tauscht du damit string[0] mit string[0] - was natuerlich keine auswirkungen hat.

    um deine strings am ende auszugeben benutzt du im moment zwei schleifen die alle einzelnen chars deines zweidimensionalen arrays ausgeben (koennten). allerdings hast du ja noch die funktion "StringUmdrehen" dazwischen. der uebergibst du jetzt effektiv immer das k-te zeichen des i-ten strings. aber es ist anzunehmen, dass die funktion einen ganzen string will und auch einen ganzen (umgedrehten) string zurueckliefert.
    dh es wuerde also eine einzige schleife ausreichen, die jeweils einfach string i an StringUmdrehen uebergibt und das ergebnis so wie jetzt ausgibt.



  • Also langsam fühle ich mich zu blöd
    Ich poste mal alles im zusammenhang°
    Bekomme immer noch in keinster Weise einen Wert ausgegeben!
    Wenn wenigstens dass funktionieren würde!
    Aber ich kann so ja gar nich überpüfen ob der Rest überhaupt richtig funktioniert

    # include <stdio.h>
    # include <string.h>
    # define ANZAHL 5
    
    size_t halbwegs_sichere_eingabe(char s[81])
    {
        int len=0;
        char buf[1024];
        gets(buf); //gets ist gefaehrlich!
        len=strlen(buf);
        if(len>80)
        {
            strncpy(s,buf,80);
            s[80]='\0';
        }
        else 
        {
            strncpy(s,buf,len);
            s[len]='\0';
        }
        return len;
    }
    
    void Abfrage(char arr[ANZAHL][81])
    {
        size_t i=0;
        while (i<ANZAHL)
        {
            if(!halbwegs_sichere_eingabe(arr[i]))
                break;
            else
                ++i;
        }
    }
    
    char* StringUmdrehen(char string[81])
    {
        int i;
        int j=0;
        char *pszstring;
        char *psztemp;
        char stringtemp[81];
    
        int laenge = strlen(string);
    
        strcpy(stringtemp, string);
        pszstring=string;
        psztemp=stringtemp;
    
        for (i = laenge-1; i >= 0; i--)
        {
        *(pszstring+j)=*(psztemp+i);
        j++;
    
        }
        return string;
    }
    
    void SortStringAlpha(char AszEingabeStrings[ANZAHL][81],int iAnzahlStrings)
    {
     int i=0,j=0, k=0;
       char temp[81]; 
    
       for(i = 0; i < iAnzahlStrings; i++)
       {
          for(j = i + 1; j < iAnzahlStrings; j++)
    	  {
    
    		  strcpy(temp, AszEingabeStrings[i]); 
              strcpy(AszEingabeStrings[i], AszEingabeStrings[j]); 
              strcpy(AszEingabeStrings[j], temp); 
    
            if( (strcmp(AszEingabeStrings[i],AszEingabeStrings[j]) > 0) ) {
               *temp=AszEingabeStrings[j][80];
    		   AszEingabeStrings[i][80]=AszEingabeStrings[j][80];
    
              AszEingabeStrings[j][80]=temp;
            }
          }
    
          }
       for(i = 0; i < iAnzahlStrings; i++)
         printf("\n%s",AszEingabeStrings[i]);
    
    }
    
    void ZeigeHilfe()
    {
        printf("*********PARAMETER HILFE***********\n");
    	printf("-u                 dreht Woerter um\n");
    	printf("-l        sortiert nach Wort-Laenge\n");
    	printf("-a           sortiert nach Alphabet\n");
    	printf("-h              zeigt die Hillfe an\n");
    
    }
    
    int main(int arg, char *szString[])
    {
    
        char szAbfrage[ANZAHL][81];
    	int j=0, iAnzahlStrings=0;
        if(arg > 1)
    {
    
        if(strcmp(szString[1],"-u")==0)
        {
            Abfrage(szAbfrage);
    		for (j=0;j<ANZAHL&&(strlen(szAbfrage[j])>0);++j)
                printf("\n%s",StringUmdrehen(szAbfrage[j]));
        }
        else if(strcmp(szString[1],"-l")==0)
            printf("Und tschuess");
    
    	 else if(strcmp(szString[1],"-a")==0)
    	 {
            Abfrage(szAbfrage);   
            for (j=0;j<ANZAHL&&(strlen(szAbfrage[j])>0);++j)
            SortStringAlpha(szAbfrage[j], iAnzahlStrings);
    		iAnzahlStrings=j++;
    
    	 }
    	 else if(strcmp(szString[1],"-h")==0)
    		 ZeigeHilfe();
    
        else 
         ZeigeHilfe();
    
    }
    else
       ZeigeHilfe();
    
      return 0;
    }
    


  • ist doch schon alles fast richtig...

    tauschen musst du natuerlich nur, wenn strcmp>0 liefert:

    void SortStringAlpha(char AszEingabeStrings[ANZAHL][81],int iAnzahlStrings)
    {
       int i=0,j=0, k=0;
    
       for(i = 0; i < iAnzahlStrings; i++)
       {
          for(j = i + 1; j < iAnzahlStrings; j++)
          {
             if( (strcmp(AszEingabeStrings[i],AszEingabeStrings[j]) > 0) )
             {
                char temp[81];
                strcpy(temp, AszEingabeStrings[i]);
                strcpy(AszEingabeStrings[i], AszEingabeStrings[j]);
                strcpy(AszEingabeStrings[j], temp);
             }
          }
    
       }
       for(i = 0; i < iAnzahlStrings; i++)
          printf("\n%s",AszEingabeStrings[i]);
    }
    

    und die funktion bekommt natuerlich das ganze zweidimensionale array und nicht per schleife jeden string einzelnd, denn sonst gibt es ja nichts zu sortieren:

    else if(strcmp(szString[1],"-a")==0)
          {
             Abfrage(szAbfrage);  
             SortStringAlpha(szAbfrage, iAnzahlStrings);
          }
    

    und dafuer muesste jetzt in "iAnzahlStrings" eben noch die anzahl der strings stehen, die eingegeben worden sind...



  • Hab alles so wie beschrieben!
    Aber ich bekomme kein einziges Wort ausgegeben!!!
    Ich weiß es nicht woran des liegt 🙂
    Danke für deine Mühe bisher 🙂
    [cpp]# include <stdio.h>
    # include <string.h>
    # define ANZAHL 5

    size_t halbwegs_sichere_eingabe(char s[81])
    {
    int len=0;
    char buf[1024];
    gets(buf); //gets ist gefaehrlich!
    len=strlen(buf);
    if(len>80)
    {
    strncpy(s,buf,80);
    s[80]='\0';
    }
    else
    {
    strncpy(s,buf,len);
    s[len]='\0';
    }
    return len;
    }

    void Abfrage(char arr[ANZAHL][81])
    {
    size_t i=0;
    while (i<ANZAHL)
    {
    if(!halbwegs_sichere_eingabe(arr[i]))
    break;
    else
    ++i;
    }
    }

    char* StringUmdrehen(char string[81])
    {
    int i;
    int j=0;
    char *pszstring;
    char *psztemp;
    char stringtemp[81];

    int laenge = strlen(string);

    strcpy(stringtemp, string);
    pszstring=string;
    psztemp=stringtemp;

    for (i = laenge-1; i >= 0; i--)
    {
    (pszstring+j)=(psztemp+i);
    j++;

    }
    return string;
    }

    void SortStringAlpha(char AszEingabeStrings[ANZAHL][81],int iAnzahlStrings)
    {
    int i=0,j=0, k=0;

    for(i = 0; i < iAnzahlStrings; i++)
    {
    for(j = i + 1; j < iAnzahlStrings; j++)
    {
    if( (strcmp(AszEingabeStrings[i],AszEingabeStrings[j]) > 0) )
    {
    char temp[81];
    strcpy(temp, AszEingabeStrings[i]);
    strcpy(AszEingabeStrings[i], AszEingabeStrings[j]);
    strcpy(AszEingabeStrings[j], temp);
    }
    }

    }

    for(i = 0; i < iAnzahlStrings; i++)
    printf("\n%s",AszEingabeStrings[i]);
    }

    void ZeigeHilfe()
    {
    printf("*********PARAMETER HILFE***********\n");
    printf("-u dreht Woerter um\n");
    printf("-l sortiert nach Wort-Laenge\n");
    printf("-a sortiert nach Alphabet\n");
    printf("-h zeigt die Hillfe an\n");

    }

    int main(int arg, char *szString[])
    {

    char szAbfrage[ANZAHL][81];
    int j=0, iAnzahlStrings=0;
    if(arg > 1)
    {

    if(strcmp(szString[1],"-u")==0)
    {
    Abfrage(szAbfrage);
    for (j=0;j<ANZAHL&&(strlen(szAbfrage[j])>0);++j)
    printf("\n%s",StringUmdrehen(szAbfrage[j]));
    }
    else if(strcmp(szString[1],"-l")==0)
    printf("Und tschuess");

    else if(strcmp(szString[1],"-a")==0)
    {
    Abfrage(szAbfrage);
    SortStringAlpha(szAbfrage, iAnzahlStrings);
    iAnzahlStrings=j++;

    }

    else if(strcmp(szString[1],"-h")==0)
    ZeigeHilfe();

    else
    ZeigeHilfe();

    }
    else
    ZeigeHilfe();

    return 0;
    }



  • in deiner main unterscheidest du verschiedene kommandozeilen-parameter.
    im fall "-a" werden mit "Abfrage" eine reihe von strings eingegeben und eben diese strings sowie deren anzahl an "SortStringAlpha" uebergeben:

    else if(strcmp(szString[1],"-a")==0)
    {
    Abfrage(szAbfrage);
    SortStringAlpha(szAbfrage, iAnzahlStrings);
    iAnzahlStrings=j++;
    }
    

    zu diesem zeitpunkt gilt aber: iAnzahlStrings=0 (siehe main ganz oben)
    dementsprechend macht die funktion "SortStringAlpha" auch nichts 🙂
    du muesstest also vor dem aufruf der funktion herausfinden, wieviele strings in "Abfrage" tatsaechlich eingegeben worden sind.
    dafuer koennte "Abfrage" zb ihre variable "i" als return-wert anbieten.



  • Aber Abfrage ist doch vom Typ void.
    Ist es da überhaupt zulässig einen Wert zurrückzuliefern?



  • Also vielen Dank mal!!
    Hat nun alles super geklappt hab einfach aus der void n int gemacht und alles geht paletti!



  • na prima 🙂
    nix zu danken!

    um den diensthabenden korrektor jetzt noch wirklich gluecklich zu machen, sollte das programm nicht nur funktionieren, sondern auch mit einer ordentlichen droehnung sinnlos-detailierter kommentare versehen werden 🙂



  • Naja ganz ist es ja noch nicht fertig! 🤡
    Muss ja schließlich noch nach Länge sortieren lassen, aber das wird schon werden!
    Ja werd mir mal Mühe geben und noch schöne Kommentare dazu schreiben 🙂
    Naja und n weiteres Programm wartet ja auch noch auf mich.
    Auf jeden Fall nochmal vielen Dank, hat mir wirklich weiter geholfen.
    Gruß Dami 🕶



  • TU München rulez!!! aber schummeln ist verboten 🙂


Anmelden zum Antworten