Forum: PC-Programmierung *argv[] zugriff auf einen Parameter


von stupp (Gast)


Lesenswert?

ich starte das programm mit zwei parametern, eine zahl und ein 
buchstabe:
programm 122 b

zahl= atoi(argv[1]); hier ist dann die 122
buchstabe = *argv[3]; hier ist das b

aber wieso brauche ich das stern vor dem argv, und bei der zahl nicht? 
Wenn ich * weglasse funktioniert es nicht, steht was anderes nur nicht b 
drin.

von Andreas R. (daybyter)


Lesenswert?

Du hast 2 Pointer zu Strings.

*<pointer> liefert den Wert, auf den der Pointer zeigt.

Dein 2. String "b" ist halt nur 1 Zeichen lang und sollte in argv[2] 
sein. Dadurch kannst Du mit *argv[2] auf das b zugreifen.
Nimmst Du als Parameter aber einen längeren String "bArgument", oder so, 
würdest Du mit *Argv[2] nur den 1. Buchstaben sehen. Die folgenden 
Zeichen siehst Du erst, wenn Du den Pointer hochzählst, bis Du auf eine 
0 triffst (String-Ende-Kennung).

von stupp (Gast)


Lesenswert?

und wieso brauche ich bei dem ersten parameter der zahl nicht das *?

Und um einen ganzen String als argument zu bekommen, geht das nur wie du 
gesagt hast mit dem durchlaufen von argv, buchstabe für buchstabe?

von Gerhard (Gast)


Lesenswert?

stupp schrieb:
> und wieso brauche ich bei dem ersten parameter der zahl nicht das *?

nicht weil es der erste Parameter ist, sondern weil die Funktion atoi 
als Parameter einen Pointer erwartet. Damit muss man den * natürlich 
weglassen.

Gerhard

von stupp (Gast)


Lesenswert?

Okay, also kann ich mit dem folgenden code das selbe bewirken?
 char param1= *argv[1];
zahl= atoi(param1);

von Andreas R. (daybyter)


Lesenswert?

Nö. Damit holst Du die erste Ziffer der Zahl ( die 1) und willst die in 
eine Zahl umwandeln. atoi erwartet kein Zeichen, sondern einen Zeiger 
auf den Anfang einer Zeichenkette.

von Rolf M. (rmagnus)


Lesenswert?

stupp schrieb:
> und wieso brauche ich bei dem ersten parameter der zahl nicht das *?

Weil du den String an atoi übergeben willst und nicht nur das erste 
Zeichen.

> Und um einen ganzen String als argument zu bekommen, geht das nur wie du
> gesagt hast mit dem durchlaufen von argv, buchstabe für buchstabe?

Nein, den String hast du ja schon. Wenn du dir jeden Buchstaben davon 
einzeln anschauen willst, dann musst du den String natürlich auch 
entsprechend durchlaufen.

von Andreas E. (hismastersvoice)


Lesenswert?

Lies mal im Kernighan/Ritchie C-Buch das Kapitel über char Strings und 
Char Arrays. Das wird dort aus meiner Sicht gut erklärt.

Argv ist ein char [][], also ein Array von char Strings, also Null 
terminiert.

atoi erwartet einen Null terminierten String, weswegen dein "char 
param1= *argv[1]" schon wegen der nicht kopierten Null-Terminierung 
nicht funktioniert.

Mit der Derefenzierung greifst Du auf das erste Element des Char 
Strings, was dann ein Char ist.
Wobei
<c>
char buchstabe = *argv[2]
</c>
und
<c>
char buchstabe = argv[2][0]
</c>
das gleiche ist.

Lies mal einfach das Kapitel, dann fällt der Groschen.

von stupp (Gast)


Lesenswert?

Wieso klappt das aber mit fopen nicht, fopen erwartet einen zeiger, 
*datei ist ein zeiger mit dem wert von arv[1] da steht der Dateiname 
drin.

char *datei = argv[1];
filePtr = fopen(datei, "r");

filePtr = fopen(argv[1],"r"); // so funktioniert es.

von 243890 (Gast)


Lesenswert?

stupp schrieb:
> Wieso klappt das aber mit fopen nicht, fopen erwartet einen
> zeiger,
> *datei ist ein zeiger mit dem wert von arv[1] da steht der Dateiname
> drin.
>
> char *datei = argv[1];
> filePtr = fopen(datei, "r");
>
> filePtr = fopen(argv[1],"r"); // so funktioniert es.

funktioniert doch beides

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.