[C] Kommandozeilenproblem... oder Pointer?

Hawkster

Erfahrenes Mitglied
Hallo ihr lieben,

hab eine Funktion geschrieben welche kommandozeilenparameter interpretieren soll...

Leider gibts ein kleines Problem... wenn ich das erste mal die Funktino aufrufe kommt der Parameter nicht richtig an... nach dem 2. mal geht es...

Könnte mir das bitte jemand erklären?
C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ARGV_INPUT  "--input="
#define ARGV_OUTPUT "--output="
#define ARGV_LANG   "--lang="
#define ARGV_HELP	"--help"
#define ARGV_DELIMITER "="

#define HELP_MSG    "Usage: wechselkurse [--input= | --output | --lang=[de|en]]\n\
--input: input file\n\
--output: output file\n\
--lang: language\n"

//Function to extract the input stream
char* get_arg_input(int argc, char* argv[]) {
    int i;
    char temp[256] = "";

    char *ptr1 = NULL; //Pointer for strstr
    char *ptr2 = NULL; //Pointer for strtok

    //==> Start at index 1 -> Filename is not our required "lang"-tag :D
    for(i=1; i < argc; i++) {
    	ptr1 = NULL;
    	ptr2 = NULL;

    	sprintf(temp, "%s", argv[i]);

    	//==> Search "--input"-Tag
    	strcpy(temp, argv[i]); //<== Copy string
    	ptr1 = strstr(strlwr(temp), ARGV_INPUT);

        //==> Found  the right index with the "needed" content
        if (ptr1 != NULL) {
            //==> Find the "lang"-Tag
            ptr2 = strtok(ptr1, ARGV_DELIMITER);
            if (ptr2 == NULL) {
            	continue;
            }

            //==> Shift Pointer to next result
            ptr2 = strtok(NULL, ARGV_DELIMITER);

            if (ptr2 != NULL) {
                return strlwr(ptr2);
            }
        }
    }
    return "stdin"; //<== Default language
}

int main(int argc, char *argv[]){

	printf("\n->Erste ausgabe:  %s", get_arg_input(argc, argv));
	printf("\n->Zweite Ausgabe: %s", get_arg_input(argc, argv));
	printf("\n->Erste ausgabe:  %s", get_arg_input(argc, argv));
	printf("\n->Zweite Ausgabe: %s", get_arg_input(argc, argv));
	printf("\n->Erste ausgabe:  %s", get_arg_input(argc, argv));
	printf("\n->Zweite Ausgabe: %s", get_arg_input(argc, argv));

	printf("\n->Erste ausgabe:  %s", get_arg_input(argc, argv));
	printf("\n->Zweite Ausgabe: %s", get_arg_input(argc, argv));
    return EXIT_SUCCESS;
}


Und die Ausgabe sieht bei mir so aus:
D:\Test>cmd_fuck.exe --input=../daten/eurofxref-hist.txt

->Erste ausgabe: ../daten/eurofxref-hist.?8>
->Zweite Ausgabe: ../daten/eurofxref-hist.txt
->Erste ausgabe: ../daten/eurofxref-hist.txt
->Zweite Ausgabe: ../daten/eurofxref-hist.txt
->Erste ausgabe: ../daten/eurofxref-hist.txt
->Zweite Ausgabe: ../daten/eurofxref-hist.txt
->Erste ausgabe: ../daten/eurofxref-hist.txt
->Zweite Ausgabe: ../daten/eurofxref-hist.txt
D:\Test>

Bin gerade sehr verwirrt...

Mfg
Hawkster
 
Zuletzt bearbeitet von einem Moderator:
Hi

der Returnpointer der Funktion ist hier jedes Mal ein Problem.

Entweder ein Literal ("stdin"): Was ist, wenn man das im main ändern will?
Oder, hier das Problem: Der Speicherbereich von temp, einer lokalen Funktionsvariable,
die am Funktionsende gelöscht wird.
Was dann für printf drinsteht, ist Zufall
(bzw. abhängig vom restlichen Code, Compiler, -optimierungen, etc. etc)

Mach einen zusätzlichen Parameter, der ein char-Array von main für das Ergebnis bekommt

Noch was: Das sprintf in der Funktion ist nicht nur problematisch (% in String?),
sondern sinnlos (strcpy gleich darunter).

Gruß
 
Zurück