PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei Parameterübergabe



deki
19-12-2003, 12:55
Hallo!

Ich habe ein kleines Problem mit der Parameterübergabe an mein Programm ;)

#include <iostream>

int main (int argc, char** argv)
{
if (argv[1] == "--help") std::cout << "Hilfe!!!" << std::endl;

return 0;
}
Dieses kleine Programm sollte doch normal "Hilfe!!!" ausgeben, wenn man es mit dem Parameter --help aufruft.
Allerdings macht es überhaupt nichts.
Der Code müsste doch eigentlich stimmen. Oder hab ich da was falsch verstanden?
Wenn ich nämlich argv[1] ausgeben lasse, steht da ja genau der Parameter....

Viele Grüße
deki

ciruZ
19-12-2003, 13:06
Ich würd mal sagen, dass es daran liegt, dass du keinen c++ string sondern ein chararray hast.

Adde mal die include Zeile:

#include <string.h>

Und mach die if-abfrage so:

if(strcmp(argv[1], "--help") == 0) std::cout << "Hilfe!" << std::endl;

Man merkt schon, dass ich absoluter C Fan bin *g*
Aber das geht afaik nur mit Hilfe der C Funktionen, oder hat C++ auch welche dafür?

// Edit:
Ich würde zur Sicherheit aber noch nen Check von argc einbauen, sonst kriegste nen Speicherzugriffsfehler. Das sähe dann so aus:

if(argc > 1 && strcmp(argv[1], "--help") == 0) std::cout << "Hilfe!" << std::endl;

Hier dann nochmal das ganze Programm:


#include <iostream>
#include <string.h>

int main(int argc, char *argv[])
{
if(argc > 1 && strcmp(argv[1], "--help") == 0) std::cout << "Hilfe!" << std::endl;
return 0;
}

deki
19-12-2003, 13:18
Hi ciruZ.

Deine Lösung funktioniert wunderbar.
Das war natürlich nur ein kleines Testprogramm um zu sehen, wo der Fehler liegen könnte, deshalb hab ich auch keine Sicherheitsabfrage reingemacht (übersichtlicher!).

Finde ich aber schon komisch, dass man das char Array nicht direkt mit dem Text vergleichen kann.

MfG
deki

ciruZ
19-12-2003, 13:20
Original geschrieben von deki
Hi ciruZ.

Deine Lösung funktioniert wunderbar.
Das war natürlich nur ein kleines Testprogramm um zu sehen, wo der Fehler liegen könnte, deshalb hab ich auch keine Sicherheitsabfrage reingemacht (übersichtlicher!).

Finde ich aber schon komisch, dass man das char Array nicht direkt mit dem Text vergleichen kann.

MfG
deki
Das ist C, kein C++ :). Mit der Zeit gewöhnt man sich dran.
// Edit: Ach ja, eigentlich sollte es ja C++ sein, aber C++ basiert ja auf C und argc / argv ist C, deshalb ist das C *g*
Nur noch so als kleine Begründung warum das C ist.

f0rtex
19-12-2003, 14:47
Hier ein Beispiel aus (man getopt_long) wie man Commandline-Arguments unter Linux parsed :-)

greets
f0rtex



#include <stdio.h> /* for printf */
#include <stdlib.h> /* for exit */
#include <getopt.h>

int
main (int argc, char **argv) {
int c;
int digit_optind = 0;

while (1) {
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] = {
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
{"verbose", 0, 0, 0},
{"create", 1, 0, 'c'},
{"file", 1, 0, 0},
{0, 0, 0, 0}
};

c = getopt_long (argc, argv, "abc:d:012",
long_options, &option_index);
if (c == -1)
break;

switch (c) {
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("\n");
break;

case '0':
case '1':
case '2':
if (digit_optind != 0 && digit_optind != this_option_optind)
printf ("digits occur in two different argv-elements.\n");
digit_optind = this_option_optind;
printf ("option %c\n", c);
break;

case 'a':
printf ("option a\n");
break;

case 'b':
printf ("option b\n");
break;

case 'c':
printf ("option c with value `%s'\n", optarg);
break;

case 'd':
printf ("option d with value `%s'\n", optarg);
break;

case '?':
break;

default:
printf ("?? getopt returned character code 0%o ??\n", c);
}
}

if (optind < argc) {
printf ("non-option ARGV-elements: ");
while (optind < argc)
printf ("%s ", argv[optind++]);
printf ("\n");
}

exit (0);
}