C-Programmierung: Aufgaben: Zeichenketten vergleichen

Aus Wikibooks

Aufgabenstellung[Bearbeiten]

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 dynamischen 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().

Musterlösung[Bearbeiten]

Online-Compiler ideone

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* einlesen(int);
int charsort(const void*,const void*);

int main (void)
{
    enum { LAENGE = 5 };
	
    char *z1;
    char *z2;

    printf("In diesem Programm koennen Sie 2 kleingeschriebene Zeichenketten mit jeweils\n"\
           "maximal %d Zeichen lexikalisch sortieren lassen.\n",LAENGE-1);		
		
    z1 = einlesen(LAENGE);
		
    if (z1==NULL)
    {
        puts("\n\nEs konnte kein ausreichender Speicher zur Verfuegung gestellt werden.\n"\
             "Das Programm wird beendet.");
        return 1;
    }
	
    z2 = einlesen(LAENGE);
		
    if (z2==NULL)
    {
        puts("\n\nEs konnte kein ausreichender Speicher zur Verfuegung gestellt werden.\n"\
             "Das Programm wird beendet.");
        free(z1);
        return 1;
    }
		
    puts("\nDie eingegebene Reihenfolge lautet:");
    puts(z1);
    puts(z2);

    /* Sortieren der Zeichenketten lexikalisch */
    qsort(z1, strlen(z1), 1, charsort);
    qsort(z2, strlen(z2), 1, charsort);
        
    puts("\nDie sortierte Reihenfolge lautet:");
    puts(z1);
    puts(z2);
        
    if( strcmp(z1,z2)==0 )
    {
    	puts("\nDie beiden Zeichenkette sind gleich.");
    }
    else
    {
    	puts("\nDie beiden Zeichenkette sind ungleich.");
    }
        
    free(z1);  /* Freigeben des Speicherplatzes */
    free(z2);  /* Freigeben des Speicherplatzes */

    return 0; 
}

char* einlesen(int maxlaenge) 
{
    char *zeichenkette = malloc(maxlaenge);
    
    if( zeichenkette!=NULL )
    {
    	int c, start;
    	printf("Bitte geben sie eine Zeichenkette mit maximal %d Zeichen ein: ",maxlaenge-1);
    
    	/* Einlesen einer beliebigen Zeichenkette mit Sonderzeichen ohne <ENTER> */
    	for(start=0; (start<maxlaenge-1) && (((c=getchar()) != EOF) && c!='\n') ;start++)
    	{
        	zeichenkette[start]=c;
    	}
    	if( start == maxlaenge-1 )
    	{
    	    while( ((c=getchar()) != EOF) && c!='\n' );
    	}
    
    	/* Hinzufügen eines Nullbytes an die letzte Stelle */
    	zeichenkette[start] = '\0';
    }

    return zeichenkette;
}

int charsort(const void *a,const void *b)
{
    const char *x = a, *y = b;
    if( *x < *y )
        return -1;
    else
    if( *x > *y )
        return 1;
    else
        return 0;
}