Eingabe von char* Strings



  • Hallo,
    ich brauche Hilfe beim deuten einer Zeile eines Bsp Prgs ausm Sedgewick. Das Prg soll hier drei Strings einlesen und die dann mit qsort sortieren. Bei der Eingabe kommt eine Zeile vor die ich nicht ganz verstehe (mit ??? gekennzeichet). Ich denke, dass sie wohl dazu dient entsprechende Laenge des eingegebenen Wortes zu uebergeben aber warum steht sie dann vor dem einlesen, waere es nicht logischer sie danach zu plazieren und das Prg entsprechend um zu aendern?

    //	Sortieren eines Arrays von Strings
    /*
    
    */
    
    #include "stock.h"
    
    int compare( const void *i, const void *j)
    {
    	return strcmp( *(char**)i, *(char **)j);
    }
    
    int main( int argc, char** argv)
    {
    	const int Nmax = 3;		// Anzahl der eingelesenen Strings, mit <ENTER> abgeschlossen
    	const int Mmax = 15;	// max. Laenge der Strings, die eingelesen werden sollen
    	char* a[Nmax];
    	int N;
    	char buf[Mmax];
    	int M = 0;
    
    	cout << "Eingabe von " << Nmax << " Strings." << endl;
    
    	for( N = 0; N < Nmax; N++)		// N ist nun gleich der Anzahl der Strings
    	{
    		a[N] = &buf[M];				// ??? Wozu dient diese Zeile und warum steht sie an dieser Stelle ???
    
    		if( !(cin >> a[N]))			// Einlesen eines neuen Wortes
    			break;
    
    		M += strlen( a[N]) + 1;		// bestimmen der Stringlaenge und speichern in M
    	}
    
    	cout << "Alphabetisches Sortieren und Ausgabe:" << endl;
    
    	qsort( a, N, sizeof( char*), compare);
    									// sortieren von a
    
    	for( int i = 0; i < N; i++)
    		cout << a[i] << endl;		// Ausgabe des nun sortierten Arrays a
    
    	system( "pause");
    	return 0;
    }
    


  • Hallo,

    mit der Länge hat es nur indirekt etwas zu tun, vielmehr würde das Programm ohne diese Zeile vor dem Einlesen auf ungültigen Speicher zugreifen. Am Anfang von main wird hier

    char* a[Nmax];
    

    ein Array aus char-Zeigern erstellt, allerdings sind die Zeiger uninitialisiert. Erst mit der Zuweisung

    a[N] = &buf[M];
    

    wird dafür gesorgt, daß in einen gültigen Speicherbereich eingelesen wird.

    MfG


Anmelden zum Antworten