Simple-Frage...! (main-Funktion)
-
Hallo,
habe folgenden Code:#include <stdlib.h> #include <stdio.h> int main(void){ int a; int b; int c=a+b; printf("Ergebnis: %d",c); return 0; }
Wie kann man den Code so umschreiben, dass wenn man im Terminal ./prog eingibt, dazu die parameter a und b eingeben muss.
Also in diesem Fall sollte wenn man das eingibt:./prog "5" "6"
im Terminal 11 rauskommen, weil ja a+b in diesem Fall ja 11 ergibt..!
Hoffe ihr versteht meine Frage..!
!..MFG Bonafide..!
-
Dazu muss die main-Funktion wie folgt aussehen:
// alternativ: int main (int argc, char *argv[]) sind äquivalent // die Bezeichner argc und argv sind nicht fix, aber _sehr_ üblich int main (int argc, char **argv) { // ... }
In
argc
steht die Anzahl der Parameter, inargv
die Parameter selbst (als Strings), wobeiargv[0]
dem Aufruf des Programms selbst entspricht (z.B. "./prog").argv[argc]
ist dann ein NULL-POinter.Für deine Aufgabe musst du noch einen String in eine Zahl umwandeln, dazu siehe die FAQ.
-
Tim schrieb:
Dazu muss die main-Funktion wie folgt aussehen:
// alternativ: int main (int argc, char *argv[]) sind äquivalent // die Bezeichner argc und argv sind nicht fix, aber _sehr_ üblich int main (int argc, char **argv) { // ... }
In
argc
steht die Anzahl der Parameter, inargv
die Parameter selbst (als Strings), wobeiargv[0]
dem Aufruf des Programms selbst entspricht (z.B. "./prog").argv[argc]
ist dann ein NULL-POinter.Für deine Aufgabe musst du noch einen String in eine Zahl umwandeln, dazu siehe die FAQ.
Danke für deine Antwort..!
Habe mir die main Funktion schon ein bishen genauer angeguckt, aber habe immer noch nicht richtig verstanden wie ich die Parameter übergeben soll.
Damit ich das besser verstehe habe ich ein anderes Beispiel genommen.
Ich öffne mit opendir einen Ordner, da zähle ich wieviele Dateien es gibt.
Der Ordnername soll als Parameter über die Komandozeile übergeben werden mit z.B. ./argument "/home"
Hier der Beispielcode:int main(int argc, char **argv) { int Dateien=0; DIR *dirOpen; struct dirent * dirEntry; dirOpen = opendir(*argv); while (0 != (dirEntry = readdir(dirOpen))) { Dateien++; } closedir(dirOpen); printf("%d\n",Dateien);
Der Coder ist aber nicht richtig, lässt sich zwar Compilen, aber beim Ausführen kommt die Fehlermeldung: Speicherzugriffsfehler.
Ist die Zeile richtig:dirOpen = opendir(*argv);
oder muss die so aussehen:
dirOpen = opendir(*argv[1]);
weil ja *argv[0] das Hauptprogram ist, oder ist der ganze Code falsch..?
-
Der Fehler hat sich erledigt, richtig war :
dirOpen = opendir(argv[1]);
Mir ist aber noch nicht klar wie man Ganzzahlen, also zahlen vom typ int übergeben kan. Hab das Thema in der FAQ gelesen aber leider nicht wirklich schlau geworden.
Was muss ich den konventieren..?
String zu Zahl oder Zahl zu String..?
Und was mache ich wenn ich ein ganzes Datum übergeben will..?
Z.B.int main(int argc, char **argv) { struct tm time; time.tm_year=argv[1]; time.tm_mon=argv[2]; time.tm_mday=argv[3]; time.tm_hour=argv[4]; time.tm_min=argv[5]; time.tm_sec=argv[6]; }
Wie könnte ich das heir umschreiben damit es funktioneirt..?
-
Bonafide schrieb:
Was muss ich den konventieren..?
String zu Zahl oder Zahl zu String..?Kommt drauf an, in welche Richtung das geht.
Hast du nen Integer und willst den an ein anderes Programm schicken, konvertierst du Integer nach String.
Übernimmt ein Programm (main) nen Parameter, dann ist
in argv[1] ein String. Willst du nen Integer daraus machen, konvertierst du von String nach Integer.Bonafide schrieb:
Und was mache ich wenn ich ein ganzes Datum übergeben will..?
Wie könnte ich das heir umschreiben damit es funktioneirt..?time_t anstatt struct tm benutzen.
-
Thx für deine Antwort..!
B.B. schrieb:
Übernimmt ein Programm (main) nen Parameter, dann ist
in argv[1] ein String. Willst du nen Integer daraus machen, konvertierst du von String nach Integer.Und wie kann ich das machen..?
Wäre nett wenn du mir den Code für das konventieren sagen würdest, in google finde ich zwar solche Codes, aber die sind immer in C++ und nich in C.B.B. schrieb:
time_t anstatt struct tm benutzen.
Wie soll das gehen..?
Ich dachte time_t liefert nur die Sekunden und nicht das volle Datum.
Will ja das ich das volle Datum als Argument der main-Funktion übergeben..!
-
Habe herausgefunde wie das geht, aber nun stehe ich wieder mal vor ein anderes Problem.
Meine Frage ist, wie kann ich denn den folgenden Code so umschreiben, dass ich nur ein Argument für das Datum benötige...?
Hier der Coder:int main(int argc, char **argv) { struct tm start_time; start_time.tm_year=atoi(argv[1]); start_time.tm_mon=atoi(argv[2]); start_time.tm_mday=atoi(argv[3]); start_time.tm_hour=atoi(argv[4]); start_time.tm_min=atoi(argv[5]); start_time.tm_sec=atoi(argv[6]); }
Wenn ich ./test 2008 3 18 17 44 25 im Terminal tippe, funktioneirt es, aber wie kann ich das umschreiben um nur ein Argument immer zu tippen, etwa so:
./test "2008-3-18 17:44:25"
-
Bonafide schrieb:
Und wie kann ich das machen..?
Wäre nett wenn du mir den Code für das konventieren sagen würdest, in google finde ich zwar solche Codes, aber die sind immer in C++ und nich in C.Also, time_t ist vom Typ long integer.
Von String nach long integer kannst du die Funktion atol benutzen.
Bei der Umwandlung von long integer nach String hilft dir die Funktion strtol.
Beide sind in der stdlib.h.B.B. schrieb:
Wie soll das gehen..?
Ich dachte time_t liefert nur die Sekunden und nicht das volle Datum.
Will ja das ich das volle Datum als Argument der main-Funktion übergeben..!Da steckt schon das volle Datum drin, in den Sekunden, wenn du dir den Wert mit time() holst.
Das sind die verstrichenen Sekunden seit dem 1. Januaranuar 1970.
Für die Umwandlung gibt es diverse Funktionen, deklariert in time.h, z.B.
localtime, usw...
Hast du ne Lib-Doku ?
-
B.B. schrieb:
Da steckt schon das volle Datum drin, in den Sekunden, wenn du dir den Wert mit time() holst.
Das sind die verstrichenen Sekunden seit dem 1. Januaranuar 1970.
Für die Umwandlung gibt es diverse Funktionen, deklariert in time.h, z.B.
localtime, usw...Also ich verstehe nicht wie ich mir den Wert mit time holen kann..?
will ja das im Terminal ./test "2008-03-16 15:48:26" schreibe und das per Argument an der main Funktion übergeben.Die Umwandlung hätte ich ja mittlerweile hinbekommen.
-
argv[1]
-
Bonafide schrieb:
Also ich verstehe nicht wie ich mir den Wert mit time holen kann..?
will ja das im Terminal ./test "2008-03-16 15:48:26" schreibe und das per Argument an der main Funktion übergeben.
Die Umwandlung hätte ich ja mittlerweile hinbekommen.Achso, in der Richtung willst du das ändern. Das geht nicht direkt über time.
Meinst du es ist sinnvoll, das der Benutzer das Datum in Anführungszeichen eintippt ?
Wenn ja: argv[1] parsen.Besser wäre doch sicher ohne: ./test 2008-03-16 15:48:26 oder ?
In dem Fall argv[1], ... argv[2] parsen.
-
Hat sich erledigt...!
DANKE euch für eure Antworten..!!..MFG Bonafide.!