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 ) != 1Was 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 ) != 1Was soll denn der Müll?
Könntest Du das spezifizieren?
-
Kannst du das spezifizieren?
Nach welchem Standard ist%Iein gültiger Formatspezifizierer?
-
Ah den meinst. Tausche gerne
%Iugegen%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.