C-Programmierung: Aufgaben: Zeichenketten vergleichen

Aus Wikibooks

Wechseln zu: Navigation, Suche

[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;
}
Persönliche Werkzeuge