C int Parameter bei Programmaufruf

D

derBobby

Gast
Moin,

Der Kopf der main sieht ja bekanntermaßen eigentlich so aus:
int main(int argc, char *argv[])

Wie kann ich der main bei Programmaufruf über Konsole/Shell einen Int-Wert übergeben? Oder geht das mit Char auch irgendwie? Dieser soll nämlich aufsummiert werden nach:

Code:
int summe = 0;

while( zahl != 0 ){

[INDENT]summe = summe + zahl;
zahl--;[/INDENT]}
 
in argc stehen die zahl der parameter und im char-array argv stehen dann die parameter samt werte
am besten kannst du sie mit getopt() auslesen, das in der unistd.h enthalten ist

hilft dir allerdings nur weiter wenn du den GNU compiler verwendest
 
Wow, ging ja schnell! ;)



Yuuri schrieb:

Danke für die Funktion! Ich glaub ich muss mir das mehr ins Bewusstsein rufen, dass es für solche Sachen schon Funktionen geben könnte. Sowas bringt man uns natürlich nicht bei. Da heißt es im Unterricht nur "googlet doch" >.< Lehrer sind toll!

-)sangai(-xeno schrieb:
Warum fummelst Du die Zeichenkette nicht einfach auseinander?

Weil ich ziemlich genau fast nichts kann in C? :D

EDV-Berni schrieb:
in argc stehen die zahl der parameter und im char-array argv stehen dann die parameter samt werte
am besten kannst du sie mit getopt() auslesen, das in der unistd.h enthalten ist (bin mir aber ned ganz sicher ob der header stimmt)

Mit weiteren Header-Files mach ich erst mal langsam. Am Ende kennt der Lehrer die in der Klausur nicht xD
 
Du weißt doch aber bestimmt was für Datentypen du hast oder? ;) Dann such doch einfach nach char to int oder string to int oder Sonstigem. Dann kommst du auch zum Ziel.
 
Yuuri schrieb:
Du weißt doch aber bestimmt was für Datentypen du hast oder? ;) Dann such doch einfach nach char to int oder string to int oder Sonstigem. Dann kommst du auch zum Ziel.

Ja, in dem Moment indem ich die Fkt von dir gesehen hab musst ich mir auch wieder denken, wie doof ich eigentlich bin. Naja, der Gedanke war ja, dass es möglicherweise irgendwie geht die main so zu schreiben:
void main(int argc, int argv[])
Wäre ja eventuell auch einfach gewesen...
 
void main(int argc, int argv[]) einspricht nicht dem C Standard!
Erstmal, weil die Main kein int als Rückgabewert hat. Jedes Programm hat aber einen Rückgabewert. Dieser wird dem Betriebssystem mitgeteilt. Ein Rückgabewert ungleich 0 heißt, dass das Programm mit einem Fehler abgebrochen wurde.
Zweitens ein Array aus Integern kann zu Fehlern führen, wenn der Benutzer was anderes als Zahlen eingibt.
Deswegen muss es int main(int argc, char argv[]) heißen!
Die Parameter müssen als String vorliegen und der Programmierer hat die verdammte Pflicht die Parameter auf Richtigkeit zu überprüfen.
 
Whiz-zarD schrieb:
void main(int argc, int argv[]) einspricht nicht dem C Standard!
Erstmal, weil die Main kein int als Rückgabewert hat. Jedes Programm hat aber einen Rückgabewert. Dieser wird dem Betriebssystem mitgeteilt. Ein Rückgabewert ungleich 0 heißt, dass das Programm mit einem Fehler abgebrochen wurde.
Zweitens ein Array aus Integern kann zu Fehlern führen, wenn der Benutzer was anderes als Zahlen eingibt.
Deswegen muss es int main(int argc, char argv[]) heißen!
Die Parameter müssen als String vorliegen und der Programmierer hat die verdammte Pflicht die Parameter auf Richtigkeit zu überprüfen.

Warum seid ihr keine Lehrer?! :D
Ihr seid klasse! Danke! :)
 
Zuletzt bearbeitet von einem Moderator:
int **argv wird auch nicht funktionieren, da du dann in deinen Integern Zeiger auf die Strings bekommst
und keine Integer.
 
Whiz-zarD schrieb:
void main(int argc, int argv[]) einspricht nicht dem C Standard!
Doch, tut es.

ISO9899 - 5.1.2.2.1 schrieb:
The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
[int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent; or in some other implementation-defined manner.

Ist zwar nicht portabel (weshalb man i.a.R. nur die ersten beiden Fassungen benutzt), aber wenn der Compiler es zulässt, ist es nicht falsch.
 
Die hier beziehen sich auf den selben Abschnitt aus dem Standard und sagen, es sei falsch:
http://c-faq.com/ansi/voidmain.html
Auch sagen sie, eine main() die nicht als int deklariert ist, könnte unter Umständen gar nicht
richtig aufgerufen werden.
Was mit deinem hervorgehobenen Satzteil genau gemeint ist, erschließt sich mir auch nicht
richtig. Die könnten auch die Argumente von main() meinen und nicht die Funktion selbst.
 
Im C89-Standard war es wohl noch erlaubt, dass die Main()-Funktion keinen Rückgabewet haben darf aber im neueren C99-Standard wird dir der Compiler Fehlermeldungen um die Ohren hauen. Dies steht sogar in deinem Zitierten, dass die Main()-Funktion einen Rückgabewert vom Typ Integer haben soll.

Bezüglich der Parameter:
Im C-Standard werden nur int main(void) und int main(int argc, char *argv[]) vorgegeben.
Das Betriebssystem gibt der Main()-Funktion die Anzahl der Parameter und ein Vektor mit den Parametern. Kann sein, dass Kompiler auch ein Array aus Integern akzeptiert, anstatt ein Array aus Strings aber es wäre taktisch unklug, die Parameter als Integer zu definieren. Da die Parameter als String übergeben werden. Also werden die Strings als Integer-Werten ausgelesen. Wenn also ein User eine "1" als Parameter angibt, wird das Programm dies als 48 interpretieren.
 
Zurück
Oben