Namensverwaltung mit Zeigern und dynamischen Variablen



  • #include <stdlib.h>
    #include <stddef.h>
    #include <ctype.h>
    #include <string.h>
    #include <stdio.h>
    
    #define MAX_NAME_LENGTH	52
    
    void clear( FILE * file )
    {
    	int ch = 0;
    	while( ( ch = fgetc( file ) ) != '\n' && ch != EOF );
    }
    
    char* get_name( FILE * file )
    {
    	char buffer[ MAX_NAME_LENGTH ];
    	char *start = buffer;
    	char *result = NULL;
    	size_t length = 0;
    
    	if( !fgets( buffer, MAX_NAME_LENGTH, file ) ) return NULL;
    
    	while( *start && isspace( *start ) ) ++start;
    	length = strlen( start );
    
    	if( !length ) return NULL;
    
    	if( start[ length - 1 ] == '\n' ) start[ --length ] = '\0';
    
    	if( !( result = malloc( length + 1 ) ) ) return NULL;
    
    	strcpy( result, start );
    	return result;
    }
    
    void print( char ** names, size_t num_names )
    {
    	size_t i = 0;
    
    	if( !names ) return;
    
    	for( ; i < num_names; ++i )
    		printf( "#%Iu: %s\n", i + 1, names[ i ] );
    }
    
    void sort( char ** names, size_t num_names )
    {
    	int sorted = 1;
    	size_t i = 0;
    	char *temp = NULL;
    
    	do {
    		sorted = 1;
    
    		for( i = 0; i < num_names - 1; ++i ) {
    
    			if( strcmp( names[ i ], names[ i + 1 ] ) > 0 ) {
    
    				temp = names[ i ];
    				names[ i ] = names[ i + 1 ];
    				names[ i + 1 ] = temp;
    				sorted = 0;
    			}
    		}
    
    	} while( !sorted );
    }
    
    int main()
    {
    	size_t i = 0;
    	size_t j = 0;
    	size_t num_names = 0;
    	char ** names = NULL;
    
    	while( puts( "Wieviele Namen moechten Sie eingeben? (1-10)" ), scanf( "%Iu", &num_names ) != 1 || ( num_names < 1 || 10 < num_names ) ) {
    
    		fputs( "\nUngueltige Eingabe. Bitte wiederholen!\n\n", stderr );
    		clear( stdin );
    	}
    
    	if( !( names = malloc( num_names * sizeof( char * ) ) ) ) {
    
    		fputs( "\nNot enough memory!\n\n", stderr );
    		return EXIT_FAILURE;
    	}
    
    	clear( stdin );
    	putchar( '\n' );
    
    	for( ; i < num_names; ++i ) {
    
    		printf( "Bitte Name #%Iu eingeben: ", i + 1 );
    		names[ i ] = get_name( stdin );
    
    		if( !names[ i ] ) {
    
    			fputs( "\nEingabefehler. Programm wird abgebrochen.\n\n", stderr );
    
    			for( ; j < i; ++j ) free( names[ j ] ); 
    			free( names );
    			return EXIT_FAILURE;
    		}
    	}
    
    	puts( "\n\nIhre Eingabe:\n" );
    	print( names, num_names );
    
    	for( i = 0; i < num_names; ++i ) names[ i ][ 0 ] = toupper( names[ i ][ 0 ] );
    
    	puts( "\n\nIhre Eingabe konvertiert:\n" );
    	print( names, num_names );
    
    	sort( names, num_names );
    
    	puts( "\n\nIhre Eingabe sortiert:\n" );
    	print( names, num_names );
    
    	for( i = 0; i < num_names; ++i ) free( names[ i ] );
    	free( names );
    }
    

    // edit: hollapa



  • Die Fehlermeldung:
    "Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in dynNamensFeld.exe aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    > dynNamensFeld.exe!GetNamen(char** NamPtrArr = <Nicht definierter Wert>, int NamAnz = 3) Zeile 277 + 0x9 Bytes C++"

    NamPtrArr ist nicht definiert. Ich weiß nicht was ich damit anfangen soll.

    Wir sollen unsere Programme als C++\CLR - Konsolenanwendungen erstellen, aber normales C benutzen.

    @Swordfish: Danke für deinen ausführlichen Code. Ich werde den erstmal genauer durchgehen.



  • Swordfish schrieb:

    printf( "#%Iu: %s\n", i + 1, names[ i ] );
     scanf( "%Iu", &num_names ) != 1
    

    Was soll denn der Müll?



  • hudzi schrieb:

    Wir sollen unsere Programme als C++\CLR - Konsolenanwendungen erstellen, aber normales C benutzen.

    Dann bist du falsch hier, dafür gibt es ein entsprechendes Subforum.



  • Das was du da beschreibst ist ein Runtime-Error.
    Der kommt zur Laufzeit und nicht beim compilieren/linken.

    Du übergibst schon einen ungültigen Wert an deine Funktion GetNamen.

    Der Fehler liegt außerhalb der Funktion.



  • Wutz schrieb:

    Swordfish schrieb:

    printf( "#%Iu: %s\n", i + 1, names[ i ] );
     scanf( "%Iu", &num_names ) != 1
    

    Was soll denn der Müll?

    Könntest Du das spezifizieren?



  • Kannst du das spezifizieren?
    Nach welchem Standard ist %I ein gültiger Formatspezifizierer?



  • Ah den meinst. Tausche gerne %Iu gegen %zu .



  • Nur dass %zu erst C99 ist und VC2008 kein C99 kann.



  • Boah Wutz, in dem Fall bleib ich bei %Iu . Andere Vorschläge?



  • %I ist überhaupt kein Standard, %z wenigstens C99. Deshalb bleibt %I immer noch Müll.



  • Wutz schrieb:

    [...] VC2008 [...]

    .



  • Swordfish schrieb:

    void clear( FILE * file )
    {
    	int ch = 0;
    	while( ( ch = fgetc( file ) ) != '\n' && ch != EOF );
    }
    
    }
    

    @Swordfish: Kannst du mir erklären warum du FILE * file benutzt? Ich darf es nicht benutzen.

    Wutz schrieb:

    Dann bist du falsch hier, dafür gibt es ein entsprechendes Subforum.

    @Wutz: Ich programmiere aber nicht mit dem Framework. Ich soll CLR als Projekttyp auswählen, aber normales C benutzen.



  • hudzi schrieb:

    NamPtrArr ist nicht definiert. Ich weiß nicht was ich damit anfangen soll.

    hahahahaha
    woher hast du denn den code copygepastet?
    🙄



  • hudzi schrieb:

    Ich habe dann nun 6 Funktionen:
    ...
    Eine zum Puffer leeren (kein Problem).
    ...

    hudzi schrieb:

    Swordfish schrieb:

    void clear( FILE * file )
    {
    	int ch = 0;
    	while( ( ch = fgetc( file ) ) != '\n' && ch != EOF );
    }
    

    @Swordfish: Kannst du mir erklären warum du FILE * file benutzt? Ich darf es nicht benutzen.



  • Hat sich erledigt.
    Trotzdem danke.


Anmelden zum Antworten