Sort nach Alphabet
-
Hallo!
Ich soll einen Algorithmus schreiben, der ein zweidiminsoniales char Array nach dem Alphabet sortiert!Dies hab ich bisher
void SortStringAlpha(char AszEingabeStrings[ANZAHL][81],int iAnzahlStrings) { int i=0,j=0, k=0; char *temp; for(i = 0; i < iAnzahlStrings; i++) { for(j = i + 1; j < iAnzahlStrings; j++) { if( (strcmp(AszEingabeStrings[i][81],AszEingabeStrings[iAnzahlStrings][j]) > 0) ) { temp=AszEingabeStrings[j][81]; AszEingabeStrings[i][81]=AszEingabeStrings[j][81]; AszEingabeStrings[j][81]=temp; } } } for(i = 0; i < iAnzahlStrings; i++) {for (k=0; k <iAnzahlStrings;i++) printf("\n%s",StringUmdrehen(AszEingabeStrings[i][k])); } }
Leider geht die Ausgabe nicht. Irgendwas mach ich falsch hat einer ne Ahnung?
Villeicht schon beim aufrufen der Funktion?Abfrage(szAbfrage); for (j=0;j<ANZAHL&&(strlen(szAbfrage[j])>0);++j) SortStringAlpha(szAbfrage[j], iAnzahlStrings); iAnzahlStrings=j++;
Vielen dank nun schonmal!
Gruß Dami
-
ich nehme mal an, dass du in wirklichkeit eine list von strings sortieren willst?
dabei gilt: ein string ist in c ein array einzelner zeichen (char), ein array von strings dementsprechend ein zweidimensionales array von chars, dh bei deiner deklarationchar AszEingabeStrings[ANZAHL][81]
hast du effektiv ANZAHL strings die jeweils aus 81 chars bestehen, dh es befindet sich in in den chars AszEingabeStrings[0][0] bis AszEingabeStrings[0][80] der erste string, in AszEingabeStrings[1][0] bis AszEingabeStrings[1][80] der zweite usw...
der zugriff auf [i][81] ist dabei unzulaessig, weil in jedem string nur die zeichen 0..80 (macht insgesamt 81) existieren und du so bei [i+1][0] landest (weils im speicher gleich dahinter steht).
die funktion strcmp moechte als eingabe zwei char-arrays (strings) um diese zu vergleichen. um in deinem fall also zwei strings i & j zu vergleichen, waere der entsprechende syntax:
strcmp(AszEingabeStrings[i], AszEingabeStrings[j])
oder
strcmp(&AszEingabeStrings[i][0], &AszEingabeStrings[j][0])
(die adresse des ersten chars im jeweiligen string)
um die beiden strings zu tauschen benoetigst du ausserdem platz fuer einen weiteren string (temp) und nicht nur einen zeiger:
char temp[81];
strcpy(temp, AszEingabeStrings[i]);
strcpy(AszEingabeStrings[i], AszEingabeStrings[j]);
strcpy(AszEingabeStrings[j], temp);
-
Vielen Dank erst mal!
Dass heisst also es sieht nun erst mal so aus:Naja aber meine Ausgabe funzt immer noch nicht hm hab auch des gefühl dass der sortieralgorythmus so noch nicht stimmt! Sollte ich einzeln auf die einzelnen Elemente zugreifen?
Hab ja immer noch überall die 81 drinnstehen!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][81]; AszEingabeStrings[i][81]=AszEingabeStrings[j][81]; AszEingabeStrings[j][81]=temp; } } } for(i = 0; i < iAnzahlStrings; i++) {for (k=0; k <iAnzahlStrings;i++) printf("\n%s",StringUmdrehen(AszEingabeStrings[i][k])); }
-
Und noch etwas kann mir jemand sagen, wie ich aus einer Void Funktion die Main Funktion wieder aufrufe???
Gruß Dami
-
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 5size_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