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.
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).
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?
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
Okay, also kann ich mit dem folgenden code das selbe bewirken? char param1= *argv[1]; zahl= atoi(param1);
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.