*argv[] zugriff auf einen Parameter

Gast #5106182
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
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
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?
Gast #5106198
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
#5106332
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.