Kommandozeilenparameter

F

Freehawk

Jungspund
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
 
"Switchen" kannst'e mit Strings vergessen.

Gruß,
Lord Kefir
 
Man könnte die Strings mit atoi() in ein Integer konvertieren und damit das switch machen, aber direkt mit Strings geht das nicht.
 
Oder um es einem meiner Profs nachzuplappern: Switch ist sowieso boese.
 
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]
 
Zuletzt bearbeitet:
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
 
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
 
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
 
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
}
 
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
 
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
 
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
 
Zuletzt bearbeitet:
Mensch, mal ein bischen mehr Selbstvertrauen! Solange es funktioniert ist doch gut :)

Gruß,
Lord Kefir
 

Ähnliche Themen

C Code Hilfe!!! gesucht bei Dezimalzahl in Binärzahl for loop

Unix Webserver mit HTML Seite erstellen

Prozesskommunikation mit PIPES - wie funktioniert das?

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Zurück
Oben