C-Programmierung: Aufgaben: Zeichenketten vergleichen
Aus Wikibooks
[Bearbeiten] Aufgabenstellung
Schreiben Sie ein Programm, das zwei eingelesene Zeichenketten miteinander vergleicht. Die Eingabe der Zeichenketten soll durch eine Schleife mit Einzelzeicheneingabe realisiert werden. Als Ergebnis sollen die Zeichenketten in lexikalisch richtiger Reihenfolge ausgegeben werden. Beide Zeichenketten sollen über Zeiger im Hauptspeicher zugänglich sein.
Verwenden Sie für die Eingabe einer Zeichenkette einen statischen Zwischenpuffer. Nach Beendigung der Zeichenketteneingabe in diesen Puffer soll der notwendige Speicherplatz angefordert werden und die Zeichenkette in den bereitgestellten freien Speicherplatz übertragen werden.
Hinweis: Informieren Sie sich über den Gebrauch der Funktionen malloc() und free().
[Bearbeiten] Musterlösung
#include <stdio.h> #include <string.h> #include <stdlib.h> #define LAENGE 5 char* einlesen (int j); int main (void) { char *zeichenkette1_gespeichert=NULL,*zeichenkette2_gespeichert=NULL char *temp2,*temp1,temp3,temp4; int start,a; do { printf("In diesem Programm koennen Sie 2 kleingeschriebene Zeichenketten mit jeweils\nmaximal %i Zeichen lexikalisch sortieren lassen.\n",LAENGE); //Einlesen der Zeichenketten zeichenkette1_gespeichert=einlesen(1); if (zeichenkette1_gespeichert==NULL){ printf("\n\nEs konnte kein ausreichender Speicher zur Verfuegung gestellt werden. \nDas Programm wird beendet.\n"); break; } zeichenkette2_gespeichert=einlesen(2); if (zeichenkette2_gespeichert==NULL){ printf("\n\nEs konnte kein ausreichender Speicher zur Verfuegung gestellt werden. \nDas Programm wird beendet.\n"); break; } // Sotieren der Zeichenketten lexikalisch start=1; //Übergeben der Zeichenkette an temp temp1=zeichenkette1_gespeichert; temp2=zeichenkette2_gespeichert; a=0; while (*temp1!='\0'&&*temp2!='\0'&&a==0) { temp3=*(temp2); //Inhalt Übergabe Variable temp4=*(temp1); //Inhalt Übergabe Variable if(temp4>temp3) a=1; if(temp4<temp3) a=2; temp1++; //Adresse von Zeiger um 1 weiterschieben temp2++; }; printf("\ndie sotiete reihenfolge lautet:\n"); if(a==0) { temp3=*(temp2); temp4=*(temp1); if(temp4>temp3) a=1; if(temp4<temp3) a=2; if(temp4==temp3) printf("Die Zeichenketten sind gleich\n"); break; } if(a==1) { printf("%s\n",Zeichenkette2_gespeichert); printf("%s\n",Zeichenkette1_gespeichert); break; } if(a==2) { printf("%s\n",Zeichenkette1_gespeichert); printf("%s\n",Zeichenkette2_gespeichert); break; } } while(0); if (zeichenkette1_gespeichert!=NULL) { free(zeichenkette1_gespeichert); //Freigeben des Speicherplatzes zeichenkette1_gespeichert=NULL; } if (zeichenkette2_gespeichert!=NULL) { free(zeichenkette2_gespeichert); //Freigeben des Speicherplatzes zeichenkette1_gespeichert=NULL; } return 0; } //Einlesefunktion char* einlesen (int j) { int start,c; char zeichenkette[LAENGE],*pt=NULL; printf("Bitte geben sie eine Zeichen kette mit maximal %d Zeichen ein: ",LAENGE-1); // Einlesen einer beliebigen Zeichenkette mit Sonderzeichen for(start=0;(start<LAENGE-1) && ((c=getchar()) != EOF) &&c!='\n' ;start++) { zeichenkette[start]=(char)c; } //Hinzufügen eines Nullbytes an die letzte Stelle zeichenkette[start] = '\0'; if(start==LAENGE-1 && !(c == EOF || c =='\n')) //zu viele Zeichen { printf("Sie haben zu viele Zeichen eingeben. Diese koennen nicht beruecksichtigt werden\n"); while(getchar()!='\n'); //übrige Zeichen Einlesen bis Enter printf("\tes konnte nur %s beruecksichtigt werden\n\n",zeichenkette); } //Speicheranforderung pt =(char*)malloc((start+1)*sizeof(char)); if (pt!=NULL) { strcpy(pt,zeichenkette); } return pt; }