Sort nach Alphabet
-
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