Kommandozeilenparameter

Dieses Thema im Forum "C/C++" wurde erstellt von Freehawk, 17.05.2007.

  1. #1 Freehawk, 17.05.2007
    Freehawk

    Freehawk Jungspund

    Dabei seit:
    05.02.2004
    Beiträge:
    11
    Zustimmungen:
    0
    Ort:
    Wolfegg
    Hallo zusammen,

    ich bin vollkommener Newbie in Sachen C Programmierung und hab folgendes Problem:

    Irgendiwe funktioniert die die Switch Verzweigung nicht. Ist hier Switch überhaupt der richtige Ansatz oder sollte ich das lieber mit If/Else machen?

    Code:
    int main(int argc, char *argv[])
    {
    	/* genau 2 Argumente müssen gegeben sein */
    	if (argc != 3)
    	{
    		help();
    	}
    	else
    	{
    		/* Variablen und Pointer Definition */
    		int pstate = 0;
    		int i = 0;
    				
    		/* öffnen des COM-Ports und setzten eines definierten Zustands*/
    		fd = open(argv[1], O_RDWR | O_NDELAY);
    		ioctl(fd, TIOCMSET, &pstate);
    
     		switch (argv[2])
     		{
     			case "start":
     			{
     				printf("start \n");
     				break;
     			}
     			default:
     			{
     				printf("Hilfe\n");
     			}
     		}
     				
    		close(fd);
    	}
    }
    Ich hoffe Ihr könnt mir weiterhelfen.

    Danke

    Gruß
    Markus
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Lord Kefir, 17.05.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    "Switchen" kannst'e mit Strings vergessen.

    Gruß,
    Lord Kefir
     
  4. #3 bitmuncher, 17.05.2007
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    Man könnte die Strings mit atoi() in ein Integer konvertieren und damit das switch machen, aber direkt mit Strings geht das nicht.
     
  5. musiKk

    musiKk Dr. Strangelove

    Dabei seit:
    30.07.2006
    Beiträge:
    264
    Zustimmungen:
    0
    Ort:
    Leipzig
    Oder um es einem meiner Profs nachzuplappern: Switch ist sowieso boese.
     
  6. #5 Lord Kefir, 17.05.2007
    Zuletzt bearbeitet: 17.05.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    atoi() gibt Dir bei einem Fehler 0 zurück - und den hast Du, sobald ein paar Buchstaben in dem String sind.

    Gruß,
    Lord Kefir

    [EDIT]
    Also wenn's denn unbedingt ein switch sein muss, kannst'e das in etwa so machen (finde ich aber selbst häßlich):
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    const char *options[] = {
    	"start",
    	"end"
    };
    
    typedef enum {OPTION_START, OPTION_END} OPTIONS;
    
    int
    get_option (const char *string) {
    	int size = sizeof (options) / sizeof (char*);
    	int ret = -1, i = 0;
    
    	while (ret == -1 && i < size) {
    		if (!(strcmp (string, options[i]))) {
    			ret = i;
    		}
    		++i;
    	}
    
    	return ret;
    }
    
    int
    main (int argc, char *argv[]) {
    	if (argc > 1) {
    		switch (get_option (argv[1])) {
    			case OPTION_START:
    				fprintf (stdout, "start\n");
    				break;
    	
    			case OPTION_END:
    				fprintf (stdout, "end\n");
    				break;
    	
    			default:
    				fprintf (stdout, "invalid option: \"%s\"\n", argv[1]);
    		}
    	}
    
    	return EXIT_SUCCESS;
    }
    
    [/EDIT]
     
  7. #6 Freehawk, 17.05.2007
    Freehawk

    Freehawk Jungspund

    Dabei seit:
    05.02.2004
    Beiträge:
    11
    Zustimmungen:
    0
    Ort:
    Wolfegg
    Hallo,

    also switch ist net das wahre so wie ich das hier raushöhre.

    Also wie mache ich das dann richtig? Ich bin ein Newbie und will es am liebsten gleich richtig machen.

    Mit if....., else if ....., else??

    Kann mir jemand ein Beispiel geben?

    Danke für die bisherigen Antworten.

    Gruß
    Markus
     
  8. #7 Lord Kefir, 17.05.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Wenn Du's mit "if else" machen willst, schau Dir einfach noch mal meinen Code an - solltest Dir eigentlich ableiten können, wie das geht.

    Gruß,
    Lord Kefir
     
  9. #8 Freehawk, 17.05.2007
    Freehawk

    Freehawk Jungspund

    Dabei seit:
    05.02.2004
    Beiträge:
    11
    Zustimmungen:
    0
    Ort:
    Wolfegg
    Hallo Lord Kefir,

    wenn ich das jetzt richtig interpretiere, dann muss ich das eingegebene Argument in argv[2] erst in INT umwandeln und ich ein Construkt schreiben und dann gegen ein anderes Construkt vergleichen damit ich die beiden Sachen miteinander vergleichen kann?

    Muss man das so umständlich machen?

    Gruß
    Markus
     
  10. #9 bitmuncher, 17.05.2007
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    Du kannst auch die Parameter direkt mit einem String vergleichen

    Code:
    if(!strcmp(argv[2], "meinparameter1") {
      // tu etwas
    } else if(!strcmp(argv[2], "meinparameter2") {
      // tu etwas anderes
    }
    
     
  11. #10 Freehawk, 17.05.2007
    Freehawk

    Freehawk Jungspund

    Dabei seit:
    05.02.2004
    Beiträge:
    11
    Zustimmungen:
    0
    Ort:
    Wolfegg
    Hallo,

    kannst du mir kurz erklären was dieser Befehl gemau macht?

    Code:
    (!strcmp(argv[2], "meinparameter1") 
    Nur damit ich verstehe was hier gemacht wird.

    Danke

    Gruß
    Markus
     
  12. #11 Lord Kefir, 17.05.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    strcmp() gibt Dir 'ne 0 zurück, wenn zwei Strings gleich sind (man strcmp).


    Muss auch zugeben, dass mein Codebeispiel ziemlich scheiße aussieht. "Sauber" wäre es dann so:

    Code:
    if (strcmp (string1, string2) == 0) ...
    
    Gruß,
    Lord Kefir
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. #12 Freehawk, 18.05.2007
    Zuletzt bearbeitet: 18.05.2007
    Freehawk

    Freehawk Jungspund

    Dabei seit:
    05.02.2004
    Beiträge:
    11
    Zustimmungen:
    0
    Ort:
    Wolfegg
    Hallo nochmal,

    danke für eure Hilfe.

    Ist das dann eher so die Art wie man das löst?
    Code:
    int main(int argc, char *argv[])
    {
    	/* genau 2 Argumente müssen gegeben sein */
    	if (argc != 3)
    	{
    		help();
    	}
    	else
    	{
    		/* Variablen und Pointer Definition */
    		int pstate = 0;
    		int i = 0;
    				
    		/* öffnen des COM-Ports und setzten eines definierten Zustands*/
    		fd = open(argv[1], O_RDWR | O_NDELAY);
    		ioctl(fd, TIOCMSET, &pstate);
    		
    		if (!strcmp(argv[2], "start"))
    		{
      			fprintf (stdout, "start\n");
    		}
    		else if (!strcmp(argv[2], "stop"))
    		{
     			fprintf (stdout, "stop\n");
    		}
    		else if (!strcmp(argv[2], "restart"))
    		{
     			fprintf (stdout, "restart\n");
    		}
    		else if (!strcmp(argv[2], "status"))
    		{
     			fprintf (stdout, "status\n");
    		}
    		else
    		{
     			help();
    		}
    		
    		
    		close(fd);
    	}
    }
    Gruß
    Markus
     
  15. #13 Lord Kefir, 18.05.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Mensch, mal ein bischen mehr Selbstvertrauen! Solange es funktioniert ist doch gut :)

    Gruß,
    Lord Kefir
     
Thema:

Kommandozeilenparameter

Die Seite wird geladen...

Kommandozeilenparameter - Ähnliche Themen

  1. Kommandozeilenparameter einlesen funktioniert nicht

    Kommandozeilenparameter einlesen funktioniert nicht: Hallo, ich habe da noch so ein Problem mit dem Einlesen der Kommandozeilenparameter meines Scriptes: Es müssen mind. 2 Paramter angegeben...
  2. Kommandozeilenparameter für YaST

    Kommandozeilenparameter für YaST: Hi, ich hab schon ziemlich viel danach gegoogelt leider nur mit dem Ergebnis das der -i und einiger Sendmail parameter. Mich würde aber...