*argv[] zugriff auf einen Parameter

Gast #5106182
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.
#5106192
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).
Gast #5106196
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?
#5106332
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.
#5106346
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.
Gast #5110171
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.
Gast #5110196
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren