?
Big Brother schrieb:
gegenspammer schrieb:
so hab noch mal versucht die fehler so gut wie möglich zu beheben, ...
Ich gebs auf.
Nö, dann doch nicht .
Ich habe versucht, dir ein ausbaufähiges Programmskelett für die Parameterauswertung zu schreiben. Der eine oder andere Tip steht in den Kommentaren. Vielleicht kannst du damit etwas anfangen.
#include <stdio.h>
#include <stdlib.h> // strtoul
// Wenn es keinen guten Grund gibt Zeiger zu benutzen, dann nimm lieber keine.
// In deiner main Funktion wählst du int t=8, richtest den Zeiger darauf,
// der Wert wird in isDigitString wieder überschrieben - ist also Sinnfrei. :)
unsigned long tablaenge; // Muss ich wirklich global sein???
// Funktion check_param_quantity.
// Nimmt inkrementiertes n entgegen.
// Prüft, ob es mindestens noch einen Parameter zum Auswerten gibt.
int check_param_quantity ( int argc, int n, char* param ) {
if ( n < argc )
return 0; // Ok, der nächste Parameter kann ausgewertet werden.
printf ( "Fehler: fehlender Wert fuer Parameter: %s\n", param );
return 1; // Fehler, es fehlt ein Parameter.
}
// Funktion is_digit_string.
// Prüft, ob nur Zahlen in param vorkommen und wandelt die Zeichenkette
// nach unsigned long um.
// Der umgewandelte Wert wird in der globalen Variable tablaenge gespeichert.
int is_digit_string ( char* param ) { // Keine Kamelhöcker für Funktionsnamen,
// wir sind hier nicht im Java Forum.
char* s = param;
while (*s) {
if (*s < '0' || *s++ > '9') {
printf ( "Fehler: unerlaubtes Zeichen im Parameter: %s\n", param );
return 1; // Nicht ok.
}
}
printf ( "%s enthaellt nur Zahlen ( %s <= ULONG_MAX? ).\n", param, param );
tablaenge = strtoul( param, NULL, 10 );
return 0; // Ok, Zeichenkette enthält nur Zahlen.
}
int v_function ( char* param ) {
puts("v_function not implemented yet.");
return 0;
}
int h_function ( char* param ) {
puts("h_function not implemented yet.");
return 0;
}
int main() {
int n = 0;
///////////////////////////////////////////////////////////////////////////////
// Simulation einer Benutzereingabe an der Konsole, damit du dir an der Konsole
// keinen Wolf tippen musst!
char* argv[] = { "C:\\test.exe",
"-t", "1234",
"-v", "irgendwas nach v",
"-h", "irgendwas nach -h",
"-t", "12a34" };
// Berechnet die Anzahl der Parameter.
int argc = sizeof argv/sizeof *argv;
///////////////////////////////////////////////////////////////////////////////
/* Auswertung der Parameter */
///////////////////////////////////////////////////////////////////////////////
// argv[0] hat meistens den Pfad zur exe:
if ( argc >= 1 )
puts ( argv[n] );
n = 1;
// Hier gilt es immer noch, die Arraygrenze einzuhalten: n < argc !!!!!
// Mach dir das Leben nicht so schwer, Werte die Parameter einzeln aus!
// Deine Funktionen geben Werte zurück, also werte sie aus!
while ( n < argc ) {
/////////////////////// Abfrage auf -t ////////////////////////////////////////
if ( strcmp ( argv[n], "-t" ) == 0 ) {
if ( check_param_quantity ( argc, n, argv[n++] )) // Aufruf inkrementiert n!
break; // Es fehlt ein Wert für Parameter -t
if ( is_digit_string ( argv[n] ) )
break; // Fehler, mindestens ein Zeichen ist keine Zahl.
}
/////////////////////// Abfrage auf -v ////////////////////////////////////////
if ( strcmp ( argv[n], "-h" ) == 0 ) {
if ( check_param_quantity ( argc, n, argv[n++] )) // Aufruf inkrementiert n!
break; // Es fehlt ein Wert für Parameter -h
if ( h_function ( argv[n] ) )
break; // Fehler.
}
/////////////////////// Abfrage auf -h ////////////////////////////////////////
if ( strcmp ( argv[n], "-v" ) == 0 ) {
if ( check_param_quantity ( argc, n, argv[n++] )) // Aufruf inkrementiert n!
break; // Es fehlt ein Wert für Parameter -v
if ( v_function ( argv[n] ) )
break; // Fehler.
}
n++;
} // while ( n < argc )
printf ( "Es wurden %d Parameter bearbeitet.\n", argc );
return 0;
}
/*
Deinem Code nach zu urteilen, wird das Programm noch ne ganze Ecke größer.
Eventuell empfiehlt es sich also, alles was in der main steht, in eine separate
Funktion auszulagern.
*/